我的程序中需要一个查找表来描述不同类型的大小。现在我得到了它:
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的模块对类型一无所知。我的想法是,当我想在程序中添加一个新类型时,我只需要包含一个头文件,而不是在程序的其余部分编辑任何内容:)
答案 0 :(得分:3)
是的,这是可能的,但可能需要您使用一些多包含和/或ifdef
欺骗。
另请参阅X macros,但当您需要将其概括为跨多个标题时,它会变得更加复杂。
答案 1 :(得分:1)
如果您的LUT模块知道其他模块,您可以进行条件编译。 有很多种方法(比如放松指出的X-macros),但这里有传统的东西:
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-macro解决方案。
LUT.c:
APP_InterfacesLUT_t MyLUT[] = {
#define X(a, b, c) { a, b },
#include "interfaces.x"
#undef X
};
interfaces.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 )