函数的条件宏#define - 导致:“function”重新定义警告

时间:2011-02-02 00:09:36

标签: gcc macros c-preprocessor

我刚看到这个帖子,描述了如何添加条件宏: 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.

4 个答案:

答案 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)))

然后,如果您配置一个优化级别来删除永远无法访问的分支,那么它应该去掉哪个案例没有被执行。这可能不是你想要的。