条件宏的#define - 造成:“功能”重新定义警告
我刚看到这个线程,描述了如何添加条件宏: 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.
我找到了我的问题here的答案。
结论: 你不能包括的#ifdef等..里面的#define,因为应该只有每行一个预处理指令。
所以,虽然我们可以打破用反斜杠“\”这有助于写可读多宏, 但预处理器将它看作一行行:
#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif }
会抛出这个错误:
error: '#' is not followed by a macro parameter.
这很有道理,所以我将不得不重新考虑我的实现。
。在你的思维怪癖其是通过类比/扩展。 doSomething()必须被看作是一个类似于函数的宏。因为它的定义是矛盾的。缩小并看到下面:
doSomething() {
#if TARGET_IPHONE_SIMULATOR
// conditionally compiled code
#else
// platform-specific code
#endif
}
要考虑的一个选择是在宏中创建条件,该条件将在编译时解析。考虑以下内容:
如果我想根据'c'的值作为预处理器操作调用一个不同的函数,我可以定义一个宏来静态检查'c'的值。
#define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c)))
然后,如果你配置的优化,删除存在永远无法到达分支的水平,应该去掉哪些曾经案件没有执行。这可能不完全是你正在寻找的。
此外,这可能会解决您收到的错误:#
和##
在宏定义中有特殊用途。 #
用于用双引号括起宏参数。 ##
用于连接两个宏参数。例如:#define ABC(X) #X
ABC(hello)
结果在"hello"
。 #define XYZ(X,Y) X##Y
XYZ(O,K)
结果在OK
。 请注意,此功能(可能)是ANSI C独有的。
此外,为什么要使用这样的宏?一个函数可能对你更好吗?
“另外,你为什么要使用这样的宏?” 是的,当时逻辑不好,让我重新思考目的和实施。 – Bach 2015-03-26 22:38:18
你忘了doSomething是一个已定义的宏。如果我有#define doSomething()#if ...这将打破宏,你会得到错误:'#'后面没有宏参数。 – Bach 2011-02-15 23:57:48