如何在#pragma message中展开含三元表达式的C预处理器宏?
问题根源与解决方案
核心问题在于枚举常量和预处理器宏的处理阶段不同:
- 枚举是编译期常量,负责处理
#define、#pragma message的预处理器阶段无法识别其数值,只会把枚举名当作普通符号处理。 - 运行时
printf能正常输出,是因为此时编译已经完成,枚举值已被替换为具体数值,三元表达式也已计算出结果。
要实现编译时#pragma message输出目标数值,有两种可靠方法:
方法一:全部改用预处理器宏定义
把枚举替换为#define,让预处理器能直接解析数值并计算三元表达式:
#define SIZE_BITS_8 8 #define SIZE_BITS_16 16 #define SIZE_BITS_32 32 #define CHOSEN_SIZE_BITS SIZE_BITS_32 #define CHOSEN_SIZE_BYTES (CHOSEN_SIZE_BITS == 8 ? 1 : (CHOSEN_SIZE_BITS == 16 ? 2 : 4)) // 编译时直接输出计算后的数值 #pragma message("Chosen size bytes: " #CHOSEN_SIZE_BYTES)
预处理器会直接展开所有宏并计算三元表达式,#CHOSEN_SIZE_BYTES会被字符串化为最终的数值(比如4)。
方法二:保留枚举,但用宏映射实现预处理器识别
如果必须保留枚举,可通过宏映射让预处理器关联枚举名与对应字节数:
enum { SIZE_BITS_8 = 8, SIZE_BITS_16 = 16, SIZE_BITS_32 = 32 }; // 先用#define把枚举名和字节数绑定 #define CHOSEN_SIZE_BITS SIZE_BITS_32 #define BITS_TO_BYTES(S) _BITS_TO_BYTES(S) #define _BITS_TO_BYTES(S) BITS_TO_BYTES_##S #define BITS_TO_BYTES_SIZE_BITS_8 1 #define BITS_TO_BYTES_SIZE_BITS_16 2 #define BITS_TO_BYTES_SIZE_BITS_32 4 #define CHOSEN_SIZE_BYTES BITS_TO_BYTES(CHOSEN_SIZE_BITS) #pragma message("Chosen size bytes: " #CHOSEN_SIZE_BYTES)
这里通过两层宏展开,把CHOSEN_SIZE_BITS对应的枚举名映射为预处理器能识别的字节数宏,最终输出数值。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

