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

标签 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'"

似乎向第一个参数添加一个左括号,向第二个参数添加一个右括号,会导致预处理器将逗号视为第一个参数的部分参数,因此假定我根本没有提供第二个参数。
警告以及预处理器输出在 && 之后什么也没有显示。

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

我尝试转义括号或逗号,但这没有任何区别。
(结果相同,只是在预处理器输出中插入了转义字符。)

最佳答案

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

#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 )

关于c++ - 如何在 C++ 宏参数中使用括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40050702/

相关文章:

另一个类中的 C++\Qt 类对象

c++ - 为什么优化会杀死这个功能?

c++ - 如何在程序中打开用户自定义的扩展文件?

c - 是否可以在运行时使用宏或任何其他功能来访问具有相同成员的不同结构?(结构更新))

php - 如何在 Dreamweaver 或 Notepad++ 中创建宏/快捷方式

rust - prelude 中是否包含了 Rust std 库中的所有宏?

mysql - 为什么在关闭 magic_quotes_gpc 的情况下插入 PDO 数据库仍会导致数据库中出现反斜杠?

Javascript:转义动态内容中的引号

c++ - 在最小化停靠后恢复 Qt 应用程序,在 OS X 上使用停靠快捷方式

xaml - 如何在 ComboBoxItem 的内容中包含与号 (&)