c ++变量没有在宏中命名类型

Pan*_*ang 2 c++ macros

有这个代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译时出错:

7:3: error: 'a' does not name a type
10:1: note: in expansion of macro 'F'
Run Code Online (Sandbox Code Playgroud)

为什么a宏在它扩展的位置不可见?

Isa*_*iah 6

看看宏的扩展:

F(nn)

int tnn(int, int);
a++;
int tnn(int i, int j) {
  return i * j;
}
Run Code Online (Sandbox Code Playgroud)

变量'a' 函数之外递增,该函数是语法错误.

就像其他答案所说的那样,你无论何时都不能执行陈述; 语句必须在函数内部才能有效.

全球范围内可以有一些事情:

  1. 命名空间声明和定义
  2. 全局变量声明
  3. 函数原型和定义
  4. 模板和类声明和定义
  5. 预处理程序指令

必须在功能范围内的事情:

  1. 控制语句,如if和for
  2. 标签
  3. 函数调用

最后,上面的列表并非全包.


TLO*_*zyk 5

您的宏(在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;
}
Run Code Online (Sandbox Code Playgroud)

C ++中没有全局范围。那只是在脚本语言中。执行顺序是一个初始化库-类似于crt0.s,它构造了运行时环境。然后初始化全局变量(这部分会变得很复杂),然后运行main。

您声明失败仅仅是因为您无法将任意可执行代码放在扩展宏的位置。

PS:Bjarne说不要使用宏。实际上,他创建了const,内联和某种程度上的模板,以便可以避免使用宏。宏是邪恶的!