簡體   English   中英

c ++變量沒有在宏中命名類型

[英]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' 函數之外遞增,該函數是語法錯誤。

就像其他答案所說的那樣,你無論何時都不能執行陳述; 語句必須在函數內部才能有效。

全球范圍內可以有一些事情:

  1. 命名空間聲明和定義
  2. 全局變量聲明
  3. 函數原型和定義
  4. 模板和類聲明和定義
  5. 預處理程序指令

必須在功能范圍內的事情:

  1. 控制語句,如if和for
  2. 標簽
  3. 函數調用

最后,上面的列表並非全包。

您的宏(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM