我在CLion中做了一个测试宏的项目。我创建了一个宏来计算给它的大量参数。首先,这个宏给了我有效的输出(0表示没有args,1表示一个arg,2表示两个args .)。但后来,我不知道发生了什么,我的宏突然失效了。可能是由于大量的SIG_ILL失败和未定义的行为,当我从它的声明范围之外调用函数时,我在表达式中声明了函数。
我试图实现方法和new操作符,就像在C++中一样,但是通过C预处理器,它最终成功了,直到突然之间,我用来计算参数的宏失败了。现在它给出了一个没有arg,一个arg一个,两个arg两个。这个错误是在编译时发生的,而CLion的特性“内联当前使用”告诉我,在没有args的情况下,这个宏应该扩展到0。
以下是这个项目,简单的main.c:
#include <stdio.h>
#define Macro_argument_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, ...) _20
#define Macro_argumentsAmount(ARGS...) \
Macro_argument_20("dummy", ##ARGS, 18, 17, 16, 15, 14, 13, 12, 11,10,\
9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main() {
printf("%i", Macro_argumentsAmount());
return 0;
}我不知道,并创建了一个新项目来查看发生了什么,所以我复制/粘贴了以前的CMakeLists.txt和代码,并获得了预期的输出。
所以现在我有两个相同的项目,但输出不同。有人知道怎么回事吗?
UPD:
在检查源代码的预处理版本时,仍然需要
gcc -E main.c -std=c17 -fplan9-extensions -Werror -Wno-implicit -
Wno-error=variadic-macros -Wno-error=implicit-fallthrough我在两个项目中都看到了以下主要内容(尽管其中一个项目打印0):
# 9 "main.c"
int main() {
printf("%i", 1);
return 0;
}发布于 2018-06-25 23:21:14
当向编译器添加-std=c17选项时,禁用##ARGS的GCC逗号吞吐扩展名。
而是使用-std=gnu17来启用GNUExtensionandc2017特性。
https://stackoverflow.com/questions/51032422
复制相似问题