2011-10-20 26 views
3

我試圖使用串聯與Ç預處理當運行到以下問題:讀變量

#define substitute(id) var##id 
int main() 
{ 
    int var0 = 999; 
    int var1 = 998; 
    int var2 = 997; 
    int var3 = 996; 
    int var4 = 995; 

    int i = 0; 

    for(i; i < 5; i++) 
    { 
      printf("Valor: %i \n", substitute(i));  
    } 

    system("PAUSE"); 
    return 0; 

} 

是否有預處理器能夠讀取的值的方式「我」而不是僅僅連接「vari」?

回答

2

否。預處理器在編譯之前運行,因此在執行之前運行。

的定義

#define substitute(id) var##id 

會導致你的循環擴展到:

for(i; i < 5; i++) 
{ 
     printf("Valor: %i \n", vari);  
} 

預處理沒有變量i的知識,也不應該。

你應該使用數組:通過[]

int var[5] = {999,998,997,996,995}; 

和訪問:

for(i; i < 5; i++) 
{ 
    printf("Valor: %i \n", var[i]);  
} 
+0

謝謝。實際上,我已經爲值而不是變量定義了#,所以使用預處理器的想法似乎不那麼不合邏輯。儘管沒有迭代的能力,但我認爲唯一的解決方案是使用數組。 – ememorais

0

您需要知道,在編譯文件之前,宏被解析了一次(由預處理器),因此在運行時,循環中的每次迭代將在「調用」替代時呈現相同的結果。

0

不,因爲預處理器在編譯時運行,不運行時,但你可以使用數組:

int vars[] = { 999, 998, 997, 996, 995 }; 

for (int i = 0; i < 5; ++i) 
    printf("Valor: %i \n", vars[i]); 
2

這不可能在預處理器階段,因爲你想要什麼取決於稍後才知道的值,在運行時

你需要的是一個數組和索引操作符var[i]

-1

C宏只在編譯時擴展,而您的printf線將成爲

 printf("Valor: %i \n", vari);  
+0

預處理髮生在編譯之前。 –

+0

@LuchianGrigore是的,如果你那麼挑剔。我認爲談論編譯時和運行時是很常見的。編譯時間將是採取源代碼和製作二進制文件的事件。 – epatel

0

不,我是一個運行時的評價。預處理器無法知道我的價值。

0

你爲什麼要用預處理器做這件事?

你似乎在試圖重塑陣列:

int main() { 
    int var[] = {999, 998, 997, 996, 995}; 
    int i; 

    for (i=0; i<5; i++) 
     printf("Valor: %i\n", var[i]); 
    return 0; 
} 
0

正如許多說 - 不,宏不知道在程序編譯時或
運行時發生了什麼事情。但是...如果你希望你可以生成一些宏的代碼,直接與堆棧操作(不要試圖在家裏獨自 - 它可以打破你的計算機!:-)) - 定義宏爲:

#define substitute(adr, max, id) *(adr + max - id) 

,並呼籲像這樣:

printf("Valor: %i \n", substitute(&var4,4,i)); 

但請記住,這只是出於好奇,在現實生活中,不建議直接播放與堆棧,因爲編譯器可能(通常會)重新命令堆棧上的變量分配,還會冒着一些令人討厭的錯誤發生等等...所以更好,如其他人所說 - 做一些數組和操作。

hth!