C 如何使用前置处理器将枚举中的值记录到文件中
我声明这样的枚举:C 如何使用前置处理器将枚举中的值记录到文件中,c,gcc,enums,logging,c-preprocessor,C,Gcc,Enums,Logging,C Preprocessor,我声明这样的枚举: typedef enum message_t { mes_no_error = 0, // no message sent mes_internal = 1, // reserved for internals mes_start = 2, // when main() is executed mes_init = 3, // when inits in main() are don
typedef enum message_t {
mes_no_error = 0, // no message sent
mes_internal = 1, // reserved for internals
mes_start = 2, // when main() is executed
mes_init = 3, // when inits in main() are done
mes_end = 4, // when main() returns
mes_foo,
mes_bar,
mes_joe
} message;
#warning "mes_block_01 = " mes_joe
由于这是一个在PC上与我对话的微控制器,我想知道用于mes_foo、mes_bar、mes_joe……的值
我想我可以使用这样的编译器指令:
typedef enum message_t {
mes_no_error = 0, // no message sent
mes_internal = 1, // reserved for internals
mes_start = 2, // when main() is executed
mes_init = 3, // when inits in main() are done
mes_end = 4, // when main() returns
mes_foo,
mes_bar,
mes_joe
} message;
#warning "mes_block_01 = " mes_joe
稍后,在编译程序时,使用tee、regex和dump将值转储到文件中。然而,gcc只是告诉我:
message.h:63:2: Warnung: #warning "mes_block_01 = " mes_joe
没有值,但只有枚举名称
是否有可能将自动分配的值从枚举记录到文件中?是否有可能在编译时用预处理器显示常量/定义的值
A.8.4枚举
枚举器列表中的标识符声明为
键入int,并可能出现在需要常量的任何位置。如果没有
将显示带=的枚举,然后显示相应
常量从0开始,在从中读取声明时增加1
从左到右。带有=的枚举数给出关联的标识符
指定的值后续标识符继续前进
从指定的值开始
所以
mes\u foo=5
,mes\u bar=6
和mes\u joe=7
。您不需要在编译时做任何事情来了解这些值。它们的值是固定的。有关枚举的行为,请参见Pavan的答案
因为它们的行为是这样的,所以您永远不应该只初始化一些枚举成员。初始化全部或无。否则,在编写以下代码时可能会出现意外错误:
typedef enum
{
BLUE=2,
BLACK,
WHITE=3,
YELLOW=7
} Color_t;
Color_t color = BLACK;
if(color == WHITE)
{
printf("White"); // will get executed with color == BLACK
}
因为有这样的bug,MISRA-C:2004,9.3禁止编写这样的中途初始化枚举。@honk做到了。他认识到,我需要枚举值和人类可读名称之间的语义连接,这很容易通过GUI应用程序维护和解析。我会的,但是
#define MESSAGES \
X(MES_NO_ERROR, 0) \
X(MES_INTERNAL, 1) \
X(MES_START, 2)
进入messages.h,然后在message模块中执行
#define X(a, b) b,
enum messages_t { MESSAGES };
#undef X
谢谢 没有答案,但你为什么要这么做?未指定的值将根据一些标准规则设置,我认为
mes\u foo
->5等等,另一个问题可以回答这个问题。如果您依赖于它们具有特定的值,为什么不直接设置它们呢?枚举成员用作从微控制器发送到PC的(int)消息的名称。有一个GUI应用程序向我显示所有消息(在GtkTreeStore中)。因为消息的数量对于人类来说不容易读取,所以我想显示枚举中使用的名称。我有一个用于uC->PC通信的哑数据协议,消息应该灵活且易于更改。因此,我希望在编译时将枚举值转储到某个地方,并在GUI中动态地包含它们。有什么想法吗?你有没有研究过X宏,例如?你不能用预处理器做这件事的原因是,在编译器开始处理源代码之前,预处理器会处理源代码的文本。它对c一点也不了解,只知道文本。@按一下简单但很棒的主意!谢谢你的链接!