与C中的宏相关的语法错误

时间:2014-08-07 08:59:50

标签: c macros c-preprocessor

#include<conio.h>
#include <stdio.h>

#define small 0
#define big   1

#define dummy( _x_ )    \
( small > big ) ? ( printf _x_ ) : ( void( 0 ) )

int main() {  

    dummy( ( "Four is %d", 4 ) );
    getch();
    return 0; 
}

当我在gcc中编译上面的程序时,它给出了以下错误:

  

错误:预期&#39;)&#39;在数字常量之前。

我不明白我为什么会这样做? 对我来说似乎一切都是正确的。请帮忙。

4 个答案:

答案 0 :(得分:2)

void(0)部分是语法错误。您尝试使用0参数调用名为void的函数。这将有效:

( ( small > big ) ? printf _x_ : (void) 0 )

答案 1 :(得分:2)

问题似乎来自你的void(0)。我甚至无法将其编译为有效的C表达式/语句。

int main()
{
    void(0);
    return 0;
}

给出:

error: expected identifier or ‘(’ before numeric constant

只需将void(0)替换为0即可。无论如何,三元运算符替代品应该具有相同的类型。

答案 2 :(得分:2)

Jens为您提供解决方案,但似乎您需要(void)printf才能跳过警告:

warning: ISO C forbids conditional expr with only one void side [-pedantic]

这没有警告:

#define dummy( _x_ ) \
       (small > big) ? (void)printf _x_ : (void)0

另一方面,dummy( ( "Four is %d", 4 ) );看起来很难看,我建议使用__VA_ARGS__并在函数调用中跳过双括号:

#include <stdio.h>

#define small 0
#define big   1

#define dummy(...) \
     (small > big) ? (void)printf(__VA_ARGS__) : (void)0

int main(void)
{  
    dummy("Four is %d", 4);
    return 0; 
}

或者不通过params:

#include <stdio.h>

#define small 0
#define big   1

#define dummy (!(small > big)) ? (void)0 : (void)printf

int main(void)
{  
    dummy("Four is %d", 4);
    return 0; 
}

答案 3 :(得分:0)

宏替换后,您的代码改变了这样 -

int main() {

( 0 > 1 ) ? ( printf ( "Four is %d", 4 ) ) : ( void( 0 ) );
return 0;
}

这里编译器不知道什么是void( 0 )。它不是C中的有效语法。所以尝试用其他语句替换它。

尝试以下代码

#define dummy( _x_ )    \
( small > big ) ? ( printf _x_ ) : (printf("Conditon fails!\n"))

#define dummy( _x_ )    \
( small > big ) ? ( printf _x_ ) : ((void) 0)