2013-12-22 52 views
0

我对sprng2.0中的代码感到困惑,它让我在编译后在机器上编译错误。看来我的编译器(gcc 4.7.3)不支持#elif !#elif !是什么意思?或者我可以用#ifndef替换它吗?我们可以使用“#elif!”在c?

#ifdef SYNC 
if(expJ[dE]>sprng(genptr[k])) 
#elif !SYNC 
if(dE<=0 || expJ[dE]>sprng(genptr[k])) 
#endif 

的错误消息是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 

它给我的错误:missing expression between '(' and ')'

+2

就我个人而言,由于这种不一致性,我不会使用'#ifdef',我只是使用'#if defined(...)','#elif defined(...)'等等。更直接的imho,即使它有点冗长。 – Thomas

+3

这不是一个宏,它是一个预处理指令。你需要使用'defined(SYNC)'来检查一个宏是否被...定义好。另外,在第二种情况下,宏将永远不会被定义,所以额外的检查是多余的。 – StoryTeller

+5

'如果X .... elif!X ...'看起来有点冗余冗余。 –

回答

4

的代码在你的问题:

#ifdef SYNC 
/* ... */ 
#elif !SYNC 
/* ... */ 
#endif 

可能会或可能无法正常工作。如果宏SYNC被定义为无(未定义,但定义为展开为无记号序列),它将以您指示的方式失败。

但这是一种奇怪的写法。

#ifdef SYNC测试SYNC是否定义与否,不考虑它是如何的定义。

#elif !SYNC测试SYNC是否扩展为虚假值的表达式。如果完全没有定义SYNC,则预处理器将标识符SYNC扩展为0,并且#elif !0是完全合法的。但是,如果SYNC被定义为扩展到某个不是!的有效操作数的东西,那么您将得到一个错误。

例如,如果我编译以上任一gcc ...gcc -DSYNC ...(后者定义为SYNC1),那么就没有错误,我也得到所述第一或第二个代码块。

我若gcc -DSYNC= ...,其SYNC定义为空令牌序列编译,则#elif扩展为:

#elif ! 

这是一种语法错误。添加括号不会帮助;它只是改变错误信息。

我认为真正的问题在于,您是否将SYNC是否定义的测试与测试的值是真还是假进行了混合。

你很可能不需要#elif;只需要#else就可以了。

如果你想选择编译基于SYNC是否定义它的代码块,只写:

#ifdef SYNC 
/* ... */ 
#else 
/* ... */ 
#endif 

如果你想测试SYNC是真还是假的(并且指出,如果SYNC is not defined as a macro it expands to 0 `),你可以这样写:

​​

您可以使用的形式,但我个人宁愿#ifdef(除非有中不同的定义值之间的一些有意义的区别)。

请注意,预处理器有#ifdef#ifndef指令,但它没有#elifdef#elifndef。如果您需要在#else来测试definedness,只需使用defined操作:

... 
#elif defined(SYNC) 
... 

但我不认为你需要做的是,在这种情况下。

-1

我认为你正在寻找这样的:

#ifdef SYNC 
defined 
#elif !(SYNC) 
undefined 
#endif 

现在运行预处理器gcc -E test.c个输出:

undefined 

注意:您也可以使用#if (SYNC),这将对作为#ifdef同样的效果。

+1

#elif!(SYNC)是否等于#ifndef SYNC?关于#define SYNC 0,它会被定义或未定义或两者都没有? –

+1

'#elif(SYNC)'等于'#ifdef',如果SYNC为0,它仍然被定义,因此条件成立。 – Zaffy

+1

我得到错误:在我修改它到#elif后缺少表达式'('和')'(SYNC) –

3

最简单的将是

#ifdef SYNC 
defined 
#else 
undefined 
#endif 

或接近的代码:

#ifdef SYNC 
defined 
#elif !defined SYNC 
undefined 
#endif 
+0

我会让代码编译成功。我不知道代码#elif!SYNC的确切含义,因为它们是开源库中的代码。 –

+0

'!SYNC'假定'SYNC'被定义为零,这与根本不定义的不同。这看起来像写得不好的代码。另外'#if'和'#ifdef'也是太不同了 – egur

相关问题