2011-02-02 146 views
3

我刚看到这个线程,描述了如何添加条件宏: Conditional value for a #define条件宏的#define - 造成:“功能”重新定义警告

但对我来说,我中限定条件中的一个功能。

#if TARGET_IPHONE_SIMULATOR 

#define doSomething(){\ 
    \\ does something 
}\ 

#else 

#define doSomething(){\ 
    \\ does something else 
}\ 

#endif 

这并不工作,但我是造成gcc编译抛出这样的警告:

"doSomething" redefined 
This is the location of the previous arguments 

有任何解决方法,以帮助摆脱警告?

UPDATE:

所以,我想包括我的定义中的条件:

#define doSomething(){\ 

#if TARGET_IPHONE_SIMULATOR 
    \\ do something 
#else 
    \\ do something else 
#endif 

}\ 

而是抛出一个错误:

error: '#' is not followed by a macro parameter. 

回答

5

我找到了我的问题here的答案。

结论:不能包括的#ifdef等..里面的#define,因为应该只有每行一个预处理指令。

所以,虽然我们可以打破用反斜杠“\”这有助于写可读多宏, 但预处理器将它看作一行行:

#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif } 

会抛出这个错误:

error: '#' is not followed by a macro parameter. 

这很有道理,所以我将不得不重新考虑我的实现。

1

。在你的思维怪癖其是通过类比/扩展。 doSomething()必须被看作是一个类似于函数的宏。因为它的定义是矛盾的。缩小并看到下面:

doSomething() { 
#if TARGET_IPHONE_SIMULATOR 
    // conditionally compiled code 
#else 
    // platform-specific code 
#endif 
} 
+0

你忘了doSomething是一个已定义的宏。如果我有#define doSomething()#if ...这将打破宏,你会得到错误:'#'后面没有宏参数。 – Bach 2011-02-15 23:57:48

0

要考虑的一个选择是在宏中创建条件,该条件将在编译时解析。考虑以下内容:

如果我想根据'c'的值作为预处理器操作调用一个不同的函数,我可以定义一个宏来静态检查'c'的值。

#define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c))) 

然后,如果你配置的优化,删除存在永远无法到达分支的水平,应该去掉哪些曾经案件没有执行。这可能不完全是你正在寻找的。

1

此外,这可能会解决您收到的错误:
###在宏定义中有特殊用途。 #用于用双引号括起宏参数。 ##用于连接两个宏参数。例如:
#define ABC(X) #X
ABC(hello)结果在"hello"
#define XYZ(X,Y) X##Y
XYZ(O,K)结果在OK。 请注意,此功能(可能)是ANSI C独有的。
此外,为什么要使用这样的宏?一个函数可能对你更好吗?

+0

“另外,你为什么要使用这样的宏?” 是的,当时逻辑不好,让我重新思考目的和实施。 – Bach 2015-03-26 22:38:18