C++宏定义中的#运算符作用是什么?结合STR_ERROR宏实例说明
问题解答
#ecode是C/C++预处理阶段的字符串化运算符(Stringizing Operator),作用是将传入宏的参数原样转换为C风格字符串字面量。
以你给出的宏定义为例:
#define STR_ERROR(ecode) case ecode: return #ecode;
当你在代码中调用STR_ERROR(ENOENT)时,预处理器会将其直接展开为:
case ENOENT: return "ENOENT";
完全适配你返回const char*类型的错误码转可读字符串的场景,不需要手动为每个错误码编写对应的字符串常量,大幅减少重复代码。
补充说明
- 字符串化运算符只会把宏参数的字面内容转为字符串,不会对参数本身做预计算或宏展开:比如你有宏定义
#define ERR_NO_MEM 2,调用STR_ERROR(ERR_NO_MEM)会返回"ERR_NO_MEM"而不是"2"。如果需要先展开参数再转字符串,需要额外嵌套一层宏实现。 - 转换过程中会自动过滤参数前后的多余空白,同时自动为参数内的引号、反斜杠添加转义符,保证生成的字符串字面量合法。
- 之前搜索不到对应内容是因为搜索引擎会默认忽略
#这类特殊符号,你可以用「C宏 字符串化运算符」作为关键词搜索,就能找到对应的官方语法说明。
内容的提问来源于stack exchange,提问作者AMADANON Inc.
相关产品推荐
相关产品推荐

