拥有此代码:
#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
在宏展开的位置不可见?
答案 0 :(得分:5)
看看宏的扩展:
F(nn)
变为
int tnn(int, int);
a++;
int tnn(int i, int j) {
return i * j;
}
变量'a'正在递增 一个函数,这是一个语法错误。
就像其他答案所说的那样,你无论何时都不能执行陈述;语句必须在函数内部才能有效。
全局范围中可以有一些内容:
必须在功能范围内的事情:
最后,上述列表并非全部包含在内。
答案 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和某种程度的模板,以便您可以避免使用宏。 宏是邪恶的!!!!