Gcc 条件宏#定义导致函数的函数:";功能“;重新定义的警告

Gcc 条件宏#定义导致函数的函数:";功能“;重新定义的警告,gcc,macros,c-preprocessor,Gcc,Macros,C Preprocessor,我刚刚看到这个线程,描述了如何添加条件宏: 但在我的例子中,我在条件中定义了一个函数 #if TARGET_IPHONE_SIMULATOR #define doSomething(){\ \\ does something }\ #else #define doSomething(){\ \\ does something else }\ #endif 这确实有效,但我导致gcc编译器抛出以下警告: "doSomething" redefined This is t

我刚刚看到这个线程,描述了如何添加条件宏:

但在我的例子中,我在条件中定义了一个函数

#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.

你的思维中有一个怪癖,是通过类比/引申来的。doSomething()必须视为类似宏的函数。因此,它的定义是矛盾的。缩小并查看以下内容:

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

我找到了我问题的答案

结论: 不能包括#ifdef等。。。内部#define,因为每行只能有一个预处理指令

因此,尽管我们可以用反斜杠“\”断行,但这有助于编写可读的多行宏, 但预处理器会将其视为一行:

#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif }
这会引发此错误:

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

这是有道理的,所以我必须重新考虑我的实现

>考虑的一个选项是在编译时创建一个将在宏中解决的条件。考虑以下事项:

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

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

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

此外,这可能会解决您收到的错误:
#
在宏定义中有特殊用途
#
用于将宏参数用双引号括起来<代码>##用于连接两个宏参数。示例:
#定义ABC(X)#X

ABC(hello)
导致
“hello”

定义XYZ(X,Y)X#Y

XYZ(O,K)
导致
OK
。 请注意,此功能(可能)是ANSI C独有的。

还有,为什么要使用这样的宏?函数是否更适合您?

您忘记了doSomething是一个已定义的宏。如果我有#定义doSomething()#如果。。。这将破坏宏,您将得到错误:“#”后面没有宏参数。“另外,为什么要使用这样的宏?”没错,当时的逻辑很差,让我重新思考了目的和实现。