如何在编译时将字符宏拼接至字符串字面量?
编译时解决字符宏与字符串拼接的方案
可以通过分层宏定义实现编译时的转换,无需运行时处理,具体实现步骤如下:
定义基础无引号宏
先把选项字符定义为不带引号的标识符,作为后续转换的基础:#define OPT_SORT_NONE_BASE S编写转换辅助宏
分别实现两个辅助宏,一个将基础宏转为字符常量,另一个转为无引号的字符串(两层宏展开是为了确保基础宏先被解析,再完成字符串化):// 转为字符常量 #define TO_CHAR(c) 'c' // 转为无引号字符串 #define STRINGIFY(s) #s #define TO_STRING(s) STRINGIFY(s)实际场景使用
- 在case语句中使用字符形式:
switch (opt) { case TO_CHAR(OPT_SORT_NONE_BASE): // 对应处理逻辑 break; // 其他case分支 } - 在argp选项文档中直接拼接字符串:
(struct argp_option) { "reversed", "R", 0, 0, "Sort in descending order. This option has no effect if -" TO_STRING(OPT_SORT_NONE_BASE) " is enabled." }
- 在case语句中使用字符形式:
预处理后,字符串部分会被展开为"-S is enabled.",完全符合需求,所有转换操作都在编译阶段完成,不会带来运行时开销。
内容的提问来源于stack exchange,提问作者Hytashi
相关产品推荐
相关产品推荐

