我需要在宏的实际参数中使用括号,但括号似乎正在改变分隔宏参数的逗号的行为。
我让我的预处理器将其输出转储到文本文件中,因此我可以看到它正在生成什么 然后我进行了基本测试以确认行为。
#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 参数,因此假设我 根本没有提供 第二个参数。
这可以通过警告以及预处理器输出在&&
之后显示任何内容来证明。
所以我的问题是,我怎么能告诉预处理器逗号分隔参数,即使参数中有括号?
我试图逃避括号或逗号,但这并没有区别 (结果相同,只是将转义字符插入到预处理器输出中。)
答案 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 )