[英]C variable allocation using macro
我想按用戶使用宏將值分配給變量。
#define CountA 3
#define A0 0x01
#define A1 0x02
#define A2 0x03
CountA的定義因應用程序而異,A0,A1,...,An也因應用程序而異。 我 那不是我自己的代碼。 它是使用我的核心的用戶代碼的一部分。
#define MakeDefinitionA(n) A##(n)
unsigned char n;
unsigned char data[CountA];
unsigned char cnt;
cnt = 0;
for (n = 0; n < (unsigned char)CountA; n++) {
data[cnt++] = MakeDefinitionA(n);
}
最后,我想從這樣的用戶代碼中獲取數據值。
我能怎么做? 我應該修改什么代碼?
像這樣使用boost/preprocessor
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#define DECL(z, n, text) BOOST_PP_CAT(text, n),
#define CountA 3
#define A0 0x01
#define A1 0x02
#define A2 0x03
int main() {
unsigned char n;
unsigned char data[CountA] = { BOOST_PP_REPEAT_FROM_TO(0, CountA, DECL, A) };
unsigned char cnt = CountA;
}
擴展到
int main() {
unsigned char n;
unsigned char data[3] = { 0x01, 0x02, 0x03, };
unsigned char cnt = 3;
}
無需使用宏。 只需使用一個枚舉和一個表:
typedef enum
{
A0 = 0x01,
A1 = 0x02,
A2 = 0x03,
} A_t;
const A_t LIST [] =
{
A0,
A1,
A2
};
#define CountA ( sizeof(LIST)/sizeof(*LIST) )
int main( void )
{
unsigned char data[CountA];
unsigned char cnt;
for (size_t i = 0; i < CountA; i++) {
data[i] = LIST[i];
}
cnt = CountA;
return 0;
}
@Lundin建議使用枚舉使代碼非常有效,但是我發現一旦列表超過半頁左右,該方法將難以維護。 這就是為什么我采用這種方法的原因:
#define TAG_MAP { \
_MAP(TAG_BODY,"body"), \
_MAP(TAG_HEAD,"head"), \
_MAP(TAG_HTML,"html"), \
_MAP(TAG_UNKNOWN,"unknown"), \
}
#define _MAP(x,y) x
enum tags TAG_MAP;
#undef _MAP
#define _MAP(x,y) y
const char *tagstrings[] = TAG_MAP;
#undef _MAP
//usage: printf("%s\n",tagstrings[TAG_HTML]);
此方法可用於直接初始化data[]
,這基本上是for(;;)
循環的宏版本會做的更高效的版本(您不能取消引用變量的值以粘貼到宏)
可以將其擴展為任意數量的任意類型的元素,甚至可以擴展多個參數(如果將它們放在最后並使用,...
和__VA_ARGS__
),我經常使用它來保留一個排序列表,該列表可以使用快速二進制搜索,然后將該值用於各種查找表。
對於僅使用宏並且還使用VA_ARGS的更復雜的示例,請參閱我的 quixotic libc。所有與體系結構相關的內容都在1行上定義,並且各種預處理器指令將第n個參數映射到適當的定義。 syscall使用另一種方法來調用sycall0 ... syscall6,具體取決於傳遞的參數數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.