用宏在C中初始化LUT?

时间:2013-10-16 09:21:47

标签: c macros c-preprocessor

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

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的模块对类型一无所知。我的想法是,当我想在程序中添加一个新类型时,我只需要包含一个头文件,而不是在程序的其余部分编辑任何内容:)

2 个答案:

答案 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 )