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;
}
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;
}
宏代碼用於預處理器階段,不用於運行階段
如果您使用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代碼(從您的代碼):預處理階段的代碼
你不能做到這一點。變量名稱在運行時不存在C.
您的宏將擴展到arrj
,這是一個未定義的變量名稱。使用合適的陣列:
int arr[] = { 1, 1, 1 };
然後打印arr[j]
,但循環是這樣的:
for(j = 0; j < sizeof arr/sizeof *arr; ++j)
printf("%d\n, arr[j]);
+1好而快的答案! – Kyrol
所以那將產生arrj
結果。
C的宏觀階段的東西在程序運行之前出現這種情況,甚至在它被
很久以前解析爲實際C.,預處理器是知之甚少C語言的完全獨立的程序。
與當今大多數編譯器一樣,cc
當時只是跑了不同的階段。在運行編譯器,彙編器和鏈接器之前,它運行cpp
,C預處理器。
和cpp剛剛解析了定義,然後擴展了宏,然後退出。然後cc會運行編譯器。目前,宏擴展是內置在編譯器中的,但它根據原始設計處理程序的文本輸入。
今天在某些系統上仍然有一個/usr/bin/cpp
,但它通常只是一個shell腳本,運行編譯器映像時帶有不編譯的選項。
爲什麼陣列不適合你想要做的? – ppeterka
對於未來(對於不同的項目),您可能想了解[哈希表](http://en.wikipedia.org/wiki/Hash_table)。 – pmg