我需要一个在我的程序中描述不同类型的大小查找表。现在我觉得:

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/

10-13 08:29