0

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

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

4

2 回答 2

3

是的,这是可能的,但它可能需要您使用一些多重包含和/或ifdef诡计。

另请参阅X 宏,但当您需要将其泛化以跨多个标头工作时,它会变得更加复杂。

于 2013-10-16T09:31:19.287 回答
1

如果您的 LUT 模块知道其他模块,您可以进行条件编译。有很多方法可以解决这个问题(比如 unwind 指出的 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 宏解决方案。

LUT.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 )
于 2013-10-16T09:39:03.457 回答