2014-10-10 52 views
0
#define MAX_SIZE 32 
#define DECLEAR_RINGQUEUE(type) \ 
typedef struct RINGQUEUE_##type{ \ 
    type data[MAX_SIZE]; \ 
}RINGQUEUE_##type; \ 
...someMethod 

DECLEAR_RINGQUEUE(structA) 
DECLEAR_RINGQUEUE(int*) 

字符指針兼容「*」影響結構的名稱,如何解決這個.. 任何預處理指令可用? 或者我必須重新聲明其他定義,就像模板implemation在C

#define DECLEAR_RINGQUEUE_ptr(type) \ 
typedef struct RINGQUEUE_##type{ \ 
    type* data[MAX_SIZE]; \ 
}RINGQUEUE_##type; \ 

回答

1

使用「裸」類型的,我不認爲你可以做到這一點沒有額外的宏,因爲int*是兩個不同的令牌。

所以,你的獨立宏是一個可能性,但我會做一個細微的變化來區分intint*之間:

#define DECLEAR_RINGQUEUE_ptr(type) \ 
    typedef struct RINGQUEUE_ptr_##type{ \ 
     type *data[MAX_SIZE]; \ 
    } RINGQUEUE_ptr_##type; 

正如你現在擁有它,都將創建相同structtypedef姓名,引人錯誤。


但是,如果你第一次typedef指針類型,所以它表現爲一個令牌,你使用類似:

typedef int* pInt; 
DECLEAR_RINGQUEUE(pInt); 

這應該工作的基礎上,事實以下代碼:

#define MAX_SIZE 32 

#define DECLEAR_RINGQUEUE(type) \ 
    typedef struct RINGQUEUE_##type { \ 
     type data[MAX_SIZE]; \ 
    } RINGQUEUE_##type 

DECLEAR_RINGQUEUE(int); 

typedef int* pInt; 
DECLEAR_RINGQUEUE(pInt); 

產生,當通過pre - 處理器:

typedef struct RINGQUEUE_int { int data[32]; } RINGQUEUE_int; 

typedef int* pInt; 
typedef struct RINGQUEUE_pInt { pInt data[32]; } RINGQUEUE_pInt; 

並編譯沒有錯誤。

+0

typedef很好,你很漂亮,夥計 – user3682618 2014-10-10 03:09:08