GNU C/C++ 宏中的标记串联
Token concatenation in GNU C/C++ macro
我想写一个宏来输出表达式的文本及其值,例如
int a = 2;
PRINT(a + 1);
应该输出
a + 1 = 3
C/C++ Macro string concatenation 显示了令牌连接的使用。然而,
#define PRINT(x) std::cout << x " = " << x << "\n"
或
#define PRINT(x) std::cout << (x) " = " << x << "\n"
给予
error: expected ';' before string constant
而
#define PRINT(x) std::cout << x##" = " << x << "\n"
给予
error: pasting "1" and "" = "" does not give a valid preprocessing token
请问我怎样才能达到我的目的?谢谢!
在宏参数前使用单个 #
将其转换为字符串。
还要在参数的正常使用周围加上括号,以防止运算符优先级的意外影响。
#define PRINT(x) std::cout << #x " = " << (x) << "\n"
^ ^ ^
您不想在此处进行标记串联(或者在您 link 提出的问题中,如那里的答案所述);这不用于组合字符串文字(这是自动完成的),而是将两个标记组合在一起形成一个标记,例如
#define DECLARE_TWO_VARIABLES(x) int x ## 1, x ## 2;
DECLARE_TWO_VARIABLES(stuff)
扩展到
int stuff1, stuff2;
将 1
和 2
连接到参数 stuff
上以创建单个标记 stuff1
和 stuff2
.
我想写一个宏来输出表达式的文本及其值,例如
int a = 2;
PRINT(a + 1);
应该输出
a + 1 = 3
C/C++ Macro string concatenation 显示了令牌连接的使用。然而,
#define PRINT(x) std::cout << x " = " << x << "\n"
或
#define PRINT(x) std::cout << (x) " = " << x << "\n"
给予
error: expected ';' before string constant
而
#define PRINT(x) std::cout << x##" = " << x << "\n"
给予
error: pasting "1" and "" = "" does not give a valid preprocessing token
请问我怎样才能达到我的目的?谢谢!
在宏参数前使用单个 #
将其转换为字符串。
还要在参数的正常使用周围加上括号,以防止运算符优先级的意外影响。
#define PRINT(x) std::cout << #x " = " << (x) << "\n"
^ ^ ^
您不想在此处进行标记串联(或者在您 link 提出的问题中,如那里的答案所述);这不用于组合字符串文字(这是自动完成的),而是将两个标记组合在一起形成一个标记,例如
#define DECLARE_TWO_VARIABLES(x) int x ## 1, x ## 2;
DECLARE_TWO_VARIABLES(stuff)
扩展到
int stuff1, stuff2;
将 1
和 2
连接到参数 stuff
上以创建单个标记 stuff1
和 stuff2
.