我需要一个在我的程序中描述不同类型的大小查找表。现在我觉得:
typedef struct{
APP_InterfaceType_t Type; //This is just an enum
uint8_t Size;
}APP_InterfacesLUT_t;
APP_InterfacesLUT_t MyLUT[] = {...}
现在的问题是,我想从不同的.h文件中插入LUT的内容(我有我的原因),这必须在预处理器中完成。
我在单独的.h文件中得到了不同的类型,当我在构建中包含其中一个.h文件时,类型(在.h文件中描述)和大小应该神奇地出现在LUT中。
所以我想知道在.h文件中调用某种宏是否可行?
例如:
REGISTERTYPE(type, size);
编辑:定义LUT的模块对类型一无所知。我的想法是,当我想给程序添加一个新类型时,我只需要包含一个头文件,而不需要编辑程序的其余部分:)
最佳答案
如果LUT模块知道其他模块,则可以进行条件编译。
有很多方法可以做到这一点(如unwind所指出的X宏),但这里有一些传统的方法:
APP_InterfacesLUT_t MyLUT[] = {
#ifdef MODULE_A
{ TYPE_1, 12 },
{ TYPE_2, 45 },
#endif
#ifdef MODULE_B
{ TYPE_2, 22 },
{ TYPE_3, 77 },
#endif
};
如果您的LUT模块不知道其他模块,则无法绕过它,您必须在运行时执行此操作。
编辑:
X-宏观解决方案。
卢特c:
APP_InterfacesLUT_t MyLUT[] = {
#define X(a, b, c) { a, b },
#include "interfaces.x"
#undef X
};
接口.x:
// Molude A
X( TYPE_1, 12, something else )
X( TYPE_2, 45, something else )
// Molude B
X( TYPE_2, 22, something else )
X( TYPE_3, 77, something else )
关于c - 用宏初始化C中的LUT?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19399588/