我宣布这样的枚举:
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
没有值,只有枚举名称。
以某种方式可以将枚举中自动分配的值记录到文件中吗?是否有可能用预处理器或编译时显示常量/定义的值?
答案 0 :(得分:1)
根据K&R,
A.8.4枚举
...
枚举器列表中的标识符声明为常量 输入int,并且可以出现在需要常量的地方。如果不 带有=的枚举,然后是相应的值 常量从0开始,并在读取声明时增加1 左到右。带=的枚举数给出了相关的标识符 指定的值; 后续标识符继续进展 来自指定值
所以mes_foo=5
,mes_bar=6
和mes_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
谢谢!