2015-08-28 227 views
0

我想弄清楚是否有可能做我想要完成的定義。我基本上試圖創建2組參數的定義(在下面的例子中,我使用了高度),我可以通過索引訪問。但是這個索引可能會改變,但參數仍然可以訪問。C預處理器定義/宏

#define INDEX_M  0 
#define INDEX_Y  1 

#define HEIGHT_MALE 60 
#define HEIGHT_FEMALE 50 

#define HEIGHT_##INDEX_M HEIGHT_MALE 
#define HEIGHT_##INDEX_F HEIGHT_FEMALE 

將被用作這樣的:

for (int i = 0; i < database_size; i++){ 
    printf("Height requirement for person %d is: %d", i, HEIGHT_(person[i].gender)); 
} 

通過這種方式,我們可以通過改變男性/女性的指數相匹配的數據庫的定義,仍然有這樣的代碼工作。

我試過使用宏,但我遇到的問題是它不會讓我在定義的前半部分使用##符號。

回答

0

我結束了這個未來:

#define __HEIGHT_(X) ((X == INDEX_M) ? HEIGHT_MALE : (X == INDEX_M) ? HEIGHT_FEMALE : 0) 

現在我可以調用是這樣的:

printf("%d", __HEIGHT(INDEX_M)); 
> 60 

這似乎是生產我想要的結果。有什麼我失蹤?

編輯:改進爲通用如下:

#define ATTRIBUTE_GET(param, gender)((gender == INDEX_M) ? param ##_MALE : (gender == INDEX_F) ? param ##_FEMALE : 0) 

用作:

printf("%d", ATTRIBUTE_GET(HEIGHT, INDEX_M)); 
+0

注意,包含兩個連續的下劃線的變量名是保留(編譯器的東西,我相信),因此使用無論如何,'__HEIGHT_​​'都有潛在的危險。 –

0

不,這不行。您正在混合編譯時(#define)和運行時(表達式評估)功能。