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()#如果。。。这将破坏宏,您将得到错误:“#”后面没有宏参数。“另外,为什么要使用这样的宏?”没错,当时的逻辑很差,让我重新思考了目的和实现。