有这个代码:
#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宏在它扩展的位置不可见?
看看宏的扩展:
F(nn) 变
int tnn(int, int);
a++;
int tnn(int i, int j) {
return i * j;
}
Run Code Online (Sandbox Code Playgroud)
变量'a' 在函数之外递增,该函数是语法错误.
就像其他答案所说的那样,你无论何时都不能执行陈述; 语句必须在函数内部才能有效.
在全球范围内可以有一些事情:
必须在功能范围内的事情:
最后,上面的列表并非全包.
您的宏(在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,内联和某种程度上的模板,以便可以避免使用宏。宏是邪恶的!
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |