2012-09-08 42 views
3
#define N 10; 

int main() 
{ 
    int x; 

    for (int i=0; i<N; i++) 
     x = i; 

    return 0; 
} 

結果:的#define導致「預期主表達式」錯誤以g ++編譯此的

test-define.cpp: In function ‘int main()’: 
test-define.cpp:7:22: error: expected primary-expression before ‘;’ token 
test-define.cpp:7:22: error: expected ‘)’ before ‘;’ token 
test-define.cpp:7:24: error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive] 
test-define.cpp:7:24: note: (if you use ‘-fpermissive’ G++ will accept your code) 
test-define.cpp:7:27: error: expected ‘;’ before ‘)’ token 

但是,當我改變線7到for (int i=0; i<10; i++)它編譯罰款。

這是爲什麼?我怎樣才能使用#define指令來實現我想要的?

+5

這應該是'#define N 10'。額外的分號導致編譯器期待的for語句中有兩個分號。 –

回答

12

刪除分號 - 你會好 - 分號包含在替代

有時它讓編譯器只運行預處理器是非常有用的。隨着GCC/G ++,你可以這樣做

gcc -E file.c > result.txt 

這將告訴你如何在宏擴展(在文件的結尾暗示開始,然後向上)

+1

+1用於提示預編譯器檢查。 – Jordan

+0

@Jordan多年來幫助過我很多次,特別是當你包含一些像'#define result int'那樣奇怪的'#define'的文件,並且你有一個局部變量var result –

6

我建議用恆定替換宏:

const int N = 10; 

這是最好的避免宏時即可。宏沒有任何範圍。它們是全球性的文字替代品。編譯器從來沒有看到它們,所以如果你使用調試器,它不會知道它們。可能還有其他一些不使用它們的原因,我忘記了。

+0

非常真實 - 應該說我自己,你應該加上const爲什麼比#define好的原因 –

相關問題