如何解决宏不符合 ISO C 标准
我在 C 中使用宏时遇到问题。
我有一个宏(这个宏只是我为了重现问题而创建的一个宏,请不要评论这个宏没用的事实):
#define my_macro(x) \
({ \ // This is line 5
typeof(x) _x = x; \
typeof(x) res = x; \
\
if (_x < 0) \
_x = _x * (-1); \
for (typeof(x) _i = 0; _i < _x; _i++) \
res = res * x; \
res; \
})
我在我的程序中是这样使用的:
int main (int argc,char **argv)
{
printf("%d\n",my_macro(atoi(argv[1]))); // This is line 19
return (0);
}
当我使用 gcc
编译我的程序时:gcc test.c -Wpedantic
,这会导致警告:
warning: ISO C forbids braced-groups within expressions [-Wpedantic]
5 | ({ \
| ^
note: in expansion of macro main_test’
19 | printf("%d\n",my_macro(atoi(argv[1])));
| ^~~~~~~~~
在 this post 的评论中,他们谈到添加 __extension__
以删除警告。但即使删除了警告,我认为这也不会使宏符合 ISO。
我还发现 here 使用 do {} while (0);
可以修复警告(我自己没有尝试,因为这不是我想要使用的解决方案)。但我觉得这与其说是真正的答案,不如说是一种绕过。
所以我想知道如何解决这个问题。
如果使用 __extension__
的答案缺少信息,我真的很想听听您对此的解释。
我也没有设法找到关于 braced-groups
究竟是什么的解释。如果有人可以在评论中解释它们,我很乐意阅读本文并理解我的错误。
总的来说,任何帮助将不胜感激, 提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。