[英]c++ variable does not name a type in macro
有這個代碼:
#include <iostream>
int a=0;
#define F(f) \
int t##f(int, int);\
a ++;\
int t##f(int i, int j)
F(nn) {
return i*j;
}
int main() {
int b = tnn(3, 8);
std::cout << a << b;
}
編譯時出錯:
7:3: error: 'a' does not name a type
10:1: note: in expansion of macro 'F'
為什么不是a
在它展開的位置在宏觀可見?
看看宏的擴展:
F(nn)
變成了
int tnn(int, int);
a++;
int tnn(int i, int j) {
return i * j;
}
變量'a' 在函數之外遞增,該函數是語法錯誤。
就像其他答案所說的那樣,你無論何時都不能執行陳述; 語句必須在函數內部才能有效。
在全球范圍內可以有一些事情:
必須在功能范圍內的事情:
最后,上面的列表並非全包。
您的宏(在nn情況下)擴展為:
int a=0;
int tnn(int, int); a ++; int tnn(int i, int j) {
return i*j;
}
int main() {
int b = tnn(3, 8);
std::cout << a << b;
}
C ++中沒有全局范圍 。 這僅適用於腳本語言。 執行順序是一個初始化庫 - 類似於crt0.s,它構造了你的運行時環境。 然后初始化全局變量(這部分可能變得非常復雜)然后運行main。
您的語句失敗只是因為您不能將任意可執行代碼放在擴展宏的位置。
PS:Bjarne說不要使用宏。 實際上,他創建了const,inline和某種程度的模板,以便您可以避免使用宏。 宏是邪惡的!!!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.