簡體   English   中英

使用宏進行C變量分配

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

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