如何使用prepocessor将枚举值中的值记录到文件中

时间:2012-03-21 10:15:07

标签: 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 done
    mes_end         =   4,  // when main() returns
    mes_foo,
    mes_bar,
    mes_joe
} message;

由于这是针对在PC上与我交谈的微控制器,我想知道用于mes_foo,mes_bar,mes_joe ....的值。

我以为我可以使用这样的编译器指令:

#warning "mes_block_01 = " mes_joe

以及后来的tee,regex并在编译程序时将值转储到文件中。但是,gcc告诉我:

message.h:63:2: Warnung: #warning "mes_block_01 = " mes_joe

没有值,只有枚举名称。

以某种方式可以将枚举中自动分配的值记录到文件中吗?是否有可能用预处理器或编译时显示常量/定义的值?

3 个答案:

答案 0 :(得分:1)

根据K&R

A.8.4枚举

  

...

     

枚举器列表中的标识符声明为常量   输入int,并且可以出现在需要常量的地方。如果不   带有=的枚举,然后是相应的值   常量从0开始,并在读取声明时增加1   左到右。带=的枚举数给出了相关的标识符   指定的值; 后续标识符继续进展   来自指定值

所以mes_foo=5mes_bar=6mes_joe=7。您无需在编译时执行任何操作即可了解这些值。他们的价值是固定的。

答案 1 :(得分:0)

参见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
}

由于像这样的错误,MISRA-C:2004,9.3禁止写这样的半开始初始化的枚举。

答案 2 :(得分:0)

@honk做到了。他认识到我需要在枚举值和人类可读名称之间建立语义连接,该名称易于通过GUI应用程序进行维护和解析。我会,但

#define MESSAGES \
    X(MES_NO_ERROR, 0) \
    X(MES_INTERNAL, 1) \
    X(MES_START, 2)

进入messages.h然后在消息模块中执行

#define X(a, b) b,
enum messages_t { MESSAGES };
#undef X

谢谢!