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一点也不了解,只知道文本。@按一下简单但很棒的主意!谢谢你的链接!