2013-07-27 26 views
-1

是否可以通過包含#define名稱的字符串來獲取宏的值?或者在編譯代碼後不可能通過其名稱訪問宏?如何使用包含宏名稱的字符串獲取宏的值?

要指出,我所追求的:

#define NAME "VALUE" 
char string[5]; 

// I want the content of string to be changeable to access any define 
strncpy(string, "NAME", 4); 
fprintf(stderr, "%s\n", string); 

我想要的輸出:VALUE

編輯 由於MOHAMED的答覆,我發現這個解決方案:

#define NAME "VALUE" 
char string[5]; 

strncpy(string, "NAME", 4); 

if(strncmp(string, "NAME", 4) == 0) { 
    fprintf(stderr, "%s\n", NAME); 
} 
+0

宏的完全文本替換 – aaronman

+1

當然操作:'strncpy()函數(字符串,NAME,4);' – 2013-07-27 19:18:13

+0

@ H2CO3不是很確定:弦只有5個字符室和複印只有4個結果 「VALU」 ... – Jens

回答

3

直接使用宏名稱

strncpy(string, NAME, 4); 

您不能編輯宏

宏定義字符串的內容在編譯期進行評估。編譯器生成第二個代碼(稱爲預處理器代碼)。此代碼由編譯器生成,其中編譯器將其內容替換爲宏。

所以如果你的第一個代碼是

#define NAME "VALUE" 
char string[5]; 

strncpy(string, NAME, 4); 
fprintf(stderr, "%s\n", string); 

由compilator生成的代碼將

char string[5]; 

strncpy(string, "VALUE", 4); 
fprintf(stderr, "%s\n", string); 

你可以看到與預處理代碼:

gcc -E file.c 
+0

請參閱添加的程序註釋 – Genius

+0

您無法編輯由宏定義的字符串的內容。回答更新 – MOHAMED

+0

當「VALUE」較長時複製4個字符的意義何在? – Jens

2

不,你不能這樣做。在C編譯器本身看到代碼之前,宏在預處理階段被替換文本替換。

相關問題