簡體   English   中英

用宏初始化C中的LUT?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM