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

时间:2015-07-22 15:10:32

标签: 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;
}

编译时出错:

7:3: error: 'a' does not name a type
10:1: note: in expansion of macro 'F'

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

2 个答案:

答案 0 :(得分:5)

看看宏的扩展:

F(nn)变为

int tnn(int, int);
a++;
int tnn(int i, int j) {
  return i * j;
}

变量'a'正在递增 一个函数,这是一个语法错误。

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

全局范围中可以有一些内容:

  1. 命名空间声明和定义
  2. 全局变量声明
  3. 功能原型和定义
  4. 模板和类声明和定义
  5. 预处理程序指令
  6. 必须在功能范围内的事情:

    1. 控制语句,例如if和for
    2. 标签
    3. 功能致电
    4. 最后,上述列表并非全部包含在内。

答案 1 :(得分:4)

您的宏(在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和某种程度的模板,以便您可以避免使用宏。 宏是邪恶的!!!!