如何将#define定义的字符码与编译时常量字符串拼接?
方案1:C99及以上通用初始化方案(最推荐)
利用C99引入的指定初始化特性,直接在编译期完成数组赋值,无需运行时修改,也不需要复杂的宏处理:
#define OPCODE 0x42 // 自动计算数组长度,完全为编译期常量 char packet[] = { [0] = OPCODE, __DATE__ };
该写法的原理是:字符串字面量作为数组初始化器时,会自动将其包含的所有字符(包括末尾的\0终止符)依次赋值给数组中对应位置的元素,此处指定索引0为OPCODE后,__DATE__的内容会自动从索引1开始填充,最终数组的内容、长度和你最初的手写版本完全一致。
这个方案的优势:
- 可读性极强,逻辑直观
- OPCODE直接使用常规数值定义即可,支持十进制、十六进制等任意数值写法,非打印字符也完全兼容
- 不需要额外维护配套宏,修改OPCODE仅需修改一处
- 主流编译器(GCC、Clang、VS2015及以上版本)均完全支持
方案2:纯字符串字面量拼接方案(兼容C89)
如果需要兼容老旧的C89标准,可以通过预处理宏把OPCODE转为对应的\x转义字符串字面量,再和__DATE__拼接:
// OPCODE的数值定义,供其他逻辑使用 #define OPCODE 0x42 // 对应OPCODE的两位十六进制值,和上方OPCODE同步维护即可 #define OPCODE_HEX 42 // 字符串化辅助宏 #define STR_IMPL(x) #x #define STR(x) STR_IMPL(x) // 生成OPCODE对应的单字符字符串字面量 #define OPCODE_STR "\x" STR(OPCODE_HEX) // 编译期拼接为完整的常量字符串 char packet[] = OPCODE_STR __DATE__;
这个方案完全基于C标准的字符串字面量拼接特性,所有标准C编译器都支持。
内容的提问来源于stack exchange,提问作者Stefan Bormann
相关产品推荐
相关产品推荐

