[英]Initialize LUT in C with macros?
我的程序中需要一個查找表來描述不同類型的大小。 現在我明白了:
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的模塊對類型一無所知。 這個想法是,當我想向程序中添加新類型時,只需要包含一個頭文件,而無需在程序的其余部分中編輯任何內容:)
是的,這是可能的,但是可能會要求您使用一些多重包含和/或ifdef
技巧。
另請參見X宏 ,但是當您需要將其概括化以跨多個標頭工作時,它會變得更加復雜。
如果您的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宏解決方案。
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 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.