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. 模板和class声明和定义
  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 说不要使用宏。事实上,他创建了常量、内联和某种程度上的模板,这样你就可以避免使用宏。 宏是邪恶的!!!!