#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;在数字常量之前。
我不明白我为什么会这样做? 对我来说似乎一切都是正确的。请帮忙。
答案 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)