如何编写C++宏:定义编译期变量并调用方法?
问题解答
需求能不能实现?
这个需求完全能实现,C++预处理器支持在单个宏里生成多条预处理指令和代码语句,只要写法符合规则就行。
报错原因
你碰到的“'#' is not followed by a macro parameter”错误,是因为在宏里使用字符串化操作符#时,没有紧跟一个宏参数。比如要是你在宏里写了#"SOMENAME"这种错误写法,或者把字符串常量当成参数去做字符串化,就会触发这个问题——#只能用来把宏的参数转换成字符串字面量,不能直接作用于字符串常量或者其他非参数内容。
正确的宏写法示例
要同时生成#define指令和函数调用,得利用预处理器的多行展开能力,同时注意参数的正确传递:
// 宏参数依次是错误码数值、名称标识、描述文本 #define TL_CLI_ADD_EXIT_CODE(CODE, NAME, DESC) \ #define EXITCODE_##NAME CODE \ addExitCode(CODE, #NAME, DESC);
展开效果说明
当你调用TL_CLI_ADD_EXIT_CODE(123, SOMENAME, "Description of code")时,会展开成:
#define EXITCODE_SOMENAME 123 addExitCode(123, "SOMENAME", "Description of code");
##是连接操作符,用来把EXITCODE_和参数NAME拼接成完整的宏名EXITCODE_SOMENAME;#NAME是字符串化操作符,把参数SOMENAME转成字符串字面量"SOMENAME";- 每行末尾的反斜杠
\是用来标记宏的多行定义,确保预处理器把这些行当成一个完整的宏处理。
要注意的点
- 这个宏不能在函数内部用,因为
#define是预处理指令,必须在全局作用域或者命名空间作用域里展开; - 如果
addExitCode是类的成员函数,得确保调用时处于正确的上下文(比如有类实例的作用权限); - 别重复定义同一个
EXITCODE_XXX宏,不然会触发重定义错误。
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

