我想知道的一种效果就是,同一个枚举名,在不同的文件里面都有定义并枚举了名字,编译器是否可以做到将分散在不同文件内的、属于同一个枚举类型的枚举名合并到一块儿之后进行统一的赋值?例如:
文件A.c里面有一个
// file1.c
enum weekday {
monday,
};
// file2.c
enum weekday {
tuesday,
};
// file3.c
enum weekday {
wednesday,
};
是否存在一种编译器,在编译的时候将这三个文件中的 enum weekday
组合起来并统一赋值呢?
根据我自己的经验,这似乎确实不可行,C语言标准好像也没这个支持,编译器也没法确定哪个文件里面的枚举名应该放在什么位置。
但是我想知道在C语言中,是否具有一种编码方式可以做出类似这样的一种效果?
如果说使用GCC的attribute属性,将变量/常量定义到某个sector内,通过链接来完成,似乎也不是我期望的这类效果。
我想我需要的应该就是能够通过编译器按照规则生成常量名并赋值成连续的索引值的效果。
__COUNTER__这种宏似乎不行,他只要被调用过就会增加,不管是不是同一个类型的。
对于我目前的做法,我是通过一个宏定义将需要的内容放到一个单独的h文件,然后在某个枚举的地方包含整个h文件,并重新定义宏的展开方式。例如:
// test.h
SOME_INFO_DEFINE(zhangsan, 100, 100)
SOME_INFO_DEFINE(lisi, 300, 50)
SOME_INFO_DEFINE(wangwu, 50, 0)
// test.c
enum some_name {
#ifdef SOME_INFO_DEFINE
#undef SOME_INFO_DEFINE
#endif
#define SOME_INFO_DEFINE(name, value, other) name,
#include "test.h"
#undef SOME_INFO_DEFINE
name_max
};
int some_value[] = {
#ifdef SOME_INFO_DEFINE
#undef SOME_INFO_DEFINE
#endif
#define SOME_INFO_DEFINE(name, value, other) value,
#include "test.h"
#undef SOME_INFO_DEFINE
};
这样我在代码中就可以通过some_value[zhangsan]
,some_value[lisi]
的方式来引用值了。
不知道大家是怎么设计的。