我对sprng2.0中的代码感到困惑,它在我制作之后给了我机器上的编译错误.看来我的编译器(gcc 4.7.3)不支持#elif !,是什么#elif !意思?或者我可以用它替换它#ifndef?
#ifdef SYNC
if(expJ[dE]>sprng(genptr[k]))
#elif !SYNC
if(dE<=0 || expJ[dE]>sprng(genptr[k]))
#endif
Run Code Online (Sandbox Code Playgroud)
错误消息是error: operator '!' has no right operand
我测试过的,
#ifdef SYNC
if(expJ[dE]>sprng(genptr[k]))
#elif !(SYNC)
if(dE<=0 || expJ[dE]>sprng(genptr[k]))
#endif
Run Code Online (Sandbox Code Playgroud)
它给了我错误: missing expression between '(' and ')'
您问题中的代码:
#ifdef SYNC
/* ... */
#elif !SYNC
/* ... */
#endif
Run Code Online (Sandbox Code Playgroud)
可能会也可能不会奏效.如果宏SYNC被定义为空(未定义,但定义为扩展为无令牌序列),它将失败.
但是编写它是一种奇怪的方式.
#ifdef SYNC测试是否SYNC定义,不管它是如何定义的.
#elif !SYNC测试是否SYNC扩展为具有false值的表达式.如果SYNC根本没有定义,预处理器会将标识符扩展SYNC为0,并且#elif !0完全合法.但是如果SYNC定义为扩展为不是有效操作数的东西!,那么你将得到一个错误.
例如,如果我使用gcc ...或编译上面的gcc -DSYNC ...(后者定义SYNC为1),那么就没有错误,我得到第一个或第二个代码块.
但是如果我用gcc -DSYNC= ...它编译它,它定义SYNC为一个空令牌序列,那么#elif扩展为:
#elif !
Run Code Online (Sandbox Code Playgroud)
这是一个语法错误.添加括号无济于事; 它只是更改错误消息.
我认为,真正的问题在于,您是否正在测试是否SYNC已定义测试其值是真还是假.
你很可能不需要#elif; 只#else会这样做.
如果要根据是否SYNC定义来选择要编译的代码块,只需写入:
#ifdef SYNC
/* ... */
#else
/* ... */
#endif
Run Code Online (Sandbox Code Playgroud)
如果你想测试SYNC是真还是假(并注意到如果SYNC没有定义为宏扩展到0),你可以写:
#if SYNC
/* ... */
#else
/* ... */
#endif
Run Code Online (Sandbox Code Playgroud)
你可以使用任何一种形式,但我个人更喜欢#ifdef(除非在不同的定义值之间有一些有意义的区别SYNC).
请注意,预处理器具有#ifdef和#ifndef指令,但它没有#elifdef或#elifndef.如果您需要在a中测试定义#else,只需使用defined运算符:
...
#elif defined(SYNC)
...
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我认为你不需要这样做.