2013-01-15 17 views
0

c宏:使用,因爲我要訪問的形式的幾個變量變量

int arr1=1; 
int arr2=1; 
int arr3=1; 

所以我寫了

#define arr(i) arr##i 

但以下我希望這段代碼不工作

#include <stdio.h> 

int main(){ 
int arr1=1; 
int arr2=1; 
int arr3=1; 
int j; 
    for(j=1; j<3; j++) 
     printf("%d",arr(j)); 

return 0; 
} 
+5

爲什麼陣列不適合你想要做的? – ppeterka

+0

對於未來(對於不同的項目),您可能想了解[哈希表](http://en.wikipedia.org/wiki/Hash_table)。 – pmg

回答

3

宏代碼用於預處理器階段,不用於運行階段

如果您使用gcc -E生成預處理器代碼。你會看到你的代碼等同於:

int main(){ 
int arr1=1; 
int arr2=1; 
int arr3=1; 
int j; 
    for(j=1; j<3; j++) 
     printf("%d",arrj); 

return 0; 
} 

當你建立你的計劃,海灣合作委員會在C代碼生成anoter C代碼和它在宏內容替換代碼中的所有宏(此階段被稱爲預處理器階段)。然後生成asm代碼,然後生成二進制文件。

您可以通過gcc -E看到生成C代碼(從您的代碼):預處理階段的代碼

6

你不能做到這一點。變量名稱在運行時不存在C.

您的宏將擴展到arrj,這是一個未定義的變量名稱。使用合適的陣列:

int arr[] = { 1, 1, 1 }; 

然後打印arr[j],但循環是這樣的:

for(j = 0; j < sizeof arr/sizeof *arr; ++j) 
    printf("%d\n, arr[j]); 
+0

+1好而快的答案! – Kyrol

0

所以那將產生arrj結果。

C的宏觀階段的東西在程序運行之前出現這種情況,甚至在它被

很久以前解析爲實際C.,預處理器是知之甚少C語言的完全獨立的程序。

與當今大多數編譯器一樣,cc當時只是跑了不同的階段。在運行編譯器,彙編器和鏈接器之前,它運行cpp,C預處理器

cpp剛剛解析了定義,然後擴展了宏,然後退出。然後cc會運行編譯器。目前,宏擴展是內置在編譯器中的,但它根據原始設計處理程序的文本輸入。

今天在某些系統上仍然有一個/usr/bin/cpp,但它通常只是一個shell腳本,運行編譯器映像時帶有不編譯的選項