c++ - 在类似函数的宏中添加预处理器指令是否错误?

标签 c++ c macros

我知道我的问题类似于 this onethis one ,但我发现它不是真的一样,而且,第二个没有接受答案,我决定问一下在调用类似函数的宏时添加预处理器指令是否正确?

就我而言,我有一个类似函数的宏:

#define FUNC_MACRO(a, b)  // do something with the variables

如果定义了其他宏,我在代码中的某处调用它时会有所不同:

// ...
FUNC_MACRO(aVal
#ifdef ANOTHER_MACRO
                + offset
#endif // ANOTHER_MACRO
           , bVal);
// ...

我在我的机器(linux,使用 gcc 4.8)上进行了测试,它工作正常(有和没有预处理器指令,有和没有定义 ANOTHER_MACRO),但是这样做安全吗?

我从第一个类似问题的答案中阅读了 16.3/9 段,但我的情况也是如此吗?

最佳答案

C 语言在 6.10.3 宏替换中将此作为未定义行为,¶11:

If there are sequences of preprocessing tokens within the list of arguments that would otherwise act as preprocessing directives, the behavior is undefined.

所以这样做确实是错误的。

GCC 和其他流行的编译器可能没有捕捉到它,这可能是该语言的许多用户不知道的原因。当我的一些代码在 PCC 上编译失败时我遇到了这个问题(并及时修复了我代码中的错误)。

更新:PJTraill 在评论中询问了在宏扩展中包含预处理器指令会“误导或无意义”的情况。这是一个明显的:

    foo(a, b,
#ifdef BAR
        c);
#else
        d);
#endif

我不确定语言是否可以在宏扩展中指定 balanced 预处理器条件是可以的,但我认为你也会遇到歧义问题按照它们应该被处理的顺序。

关于c++ - 在类似函数的宏中添加预处理器指令是否错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534609/

相关文章:

c++ - 为什么引用变量需要在定义时初始化?

c++ - 高度可定制的 C++ GUI 库?

c - 有没有办法在C中打印字符串,如下: puts ("this is a string" + variable);?

c - init-declarator-list 和 GNU GCC 属性语法

c++ - CWA(dll,api) - C++ 宏?

c - 如何获取 C 宏中声明的变量的地址?

c++ - 热狗摊静态功能问题

c++ - 对具有私有(private)可访问性的重载继承函数使用声明

C打印进度条

clojure - "regular"和 "reader"宏有什么区别?