首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量宏:相同代码的不同输出

变量宏:相同代码的不同输出
EN

Stack Overflow用户
提问于 2018-06-25 22:07:52
回答 1查看 178关注 0票数 1

我在CLion中做了一个测试宏的项目。我创建了一个宏来计算给它的大量参数。首先,这个宏给了我有效的输出(0表示没有args,1表示一个arg,2表示两个args .)。但后来,我不知道发生了什么,我的宏突然失效了。可能是由于大量的SIG_ILL失败和未定义的行为,当我从它的声明范围之外调用函数时,我在表达式中声明了函数。

我试图实现方法和new操作符,就像在C++中一样,但是通过C预处理器,它最终成功了,直到突然之间,我用来计算参数的宏失败了。现在它给出了一个没有arg,一个arg一个,两个arg两个。这个错误是在编译时发生的,而CLion的特性“内联当前使用”告诉我,在没有args的情况下,这个宏应该扩展到0。

以下是这个项目,简单的main.c:

代码语言:javascript
复制
#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:

在检查源代码的预处理版本时,仍然需要

代码语言:javascript
复制
gcc -E main.c -std=c17  -fplan9-extensions  -Werror -Wno-implicit - 
Wno-error=variadic-macros -Wno-error=implicit-fallthrough

我在两个项目中都看到了以下主要内容(尽管其中一个项目打印0):

代码语言:javascript
复制
# 9 "main.c"
int main() {
 printf("%i", 1);

 return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 23:21:14

当向编译器添加-std=c17选项时,禁用##ARGS的GCC逗号吞吐扩展名。

而是使用-std=gnu17来启用GNUExtensionandc2017特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51032422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档