如何在C ++宏参数中使用括号?

时间:2016-10-14 19:30:17

标签: c++ macros escaping c-preprocessor preprocessor-directive

我需要在宏的实际参数中使用括号,但括号似乎正在改变分隔宏参数的逗号的行为。

我让我的预处理器将其输出转储到文本文件中,因此我可以看到它正在生成什么 然后我进行了基本测试以确认行为。

#define MACRO_TEST_1( X , Y ) X && Y

MACRO_TEST_1 ( A , B )
// Desired result: A && B
// Actual result:  A && B

MACRO_TEST_1 ( ( C , D ) )
// Desired result: ( C && D )
// Actual result:  ( C , D ) &&
// Warning: "not enough actual parameters for macro 'MACRO_TEST_1'"

看来,在第一个参数中添加一个左括号,在第二个参数中添加一个右括号,会导致预处理器将逗号视为第一个参数的 part 参数,因此假设我 根本没有提供 第二个参数。
这可以通过警告以及预处理器输出在&&之后显示任何内容来证明。

所以我的问题是,我怎么能告诉预处理器逗号分隔参数,即使参数中有括号?

我试图逃避括号或逗号,但这并没有区别 (结果相同,只是将转义字符插入到预处理器输出中。)

2 个答案:

答案 0 :(得分:1)

  

所以我的问题是,如何告诉预处理器逗号   即使参数有括号,也要分隔参数   在他们身上?

我认为没有办法,至少在这种宏观实施中是这样。

来自gcc.gnu.org

  

要调用带参数的宏,请编写其名称   宏后跟括号中的实际参数列表,分隔   用逗号。

     

每个参数中的前导和尾随空格都被删除了   参数的标记之间的空格减少为单个空格   空间。 每个参数中的括号必须平衡;一个逗号   这样的括号不会结束论证。

     

你不能完全抛弃争论;如果一个宏需要两个   参数,它的顶层必须只有一个逗号   参数列表。

答案 1 :(得分:0)

我在技术上找到了一个解决方案,尽管很难看 您必须为括号字符定义符号。

#define OP (
#define CP )

#define MACRO_TEST_1( X , Y ) X && Y

MACRO_TEST_1 ( A , B )
// Desired result: A && B
// Actual result:  A && B

MACRO_TEST_1 ( OP C , D CP )
// Desired result: ( C && D )
// Actual result:  ( C && D )