我刚看到这个帖子,描述了如何添加条件宏: Conditional value for a #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
是否有任何解决方法可以帮助摆脱警告?
更新
所以我尝试在我的定义中包含条件:
#define doSomething(){\
#if TARGET_IPHONE_SIMULATOR
\\ do something
#else
\\ do something else
#endif
}\
但是会引发错误:
error: '#' is not followed by a macro parameter.
答案 0 :(得分:6)
我找到了问题here的答案。
<强>结论:强> 你不能在#define中包含#ifdef等...因为每行只应该有一个预处理指令。
因此,虽然我们可以用反斜杠'\'打破这一行,但这有助于编写可读的多行宏, 但预处理器会将其视为一行:
#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif }
这引发了这个错误:
error: '#' is not followed by a macro parameter.
这是有道理的,所以我将不得不重新考虑我的实施。
答案 1 :(得分:1)
你的思维中有一个怪癖是类比/扩展。 doSomething()必须被视为类似函数的宏。因此,它的定义是矛盾的。缩小并查看以下内容:
doSomething() {
#if TARGET_IPHONE_SIMULATOR
// conditionally compiled code
#else
// platform-specific code
#endif
}
答案 2 :(得分:1)
此外,这可能会解决您收到的错误:
#
和##
在宏定义中有特殊用途。 #
用于用双引号括起宏参数。 ##
用于连接两个宏参数。示例:
#define ABC(X) #X
ABC(hello)
结果为"hello"
。
#define XYZ(X,Y) X##Y
XYZ(O,K)
结果为{{ 1}}。
请注意,此功能(可能)是ANSI C唯一的
另外,为什么你会使用像这样的宏?一个功能可能更适合你吗?
答案 3 :(得分:0)
要考虑的一个选项是在宏中创建一个条件,该条件将在编译时解析。请考虑以下事项:
如果我想根据&#39; c&#39;的值来调用不同的功能。作为预处理器操作,我可以定义一个宏来检查&#39; c&#39;静态。
#define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c)))
然后,如果您配置一个优化级别来删除永远无法访问的分支,那么它应该去掉哪个案例没有被执行。这可能不是你想要的。