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' 正在递增 在 函数之外,这是一个语法错误。
就像另一个答案所说的那样,您不能随心所欲地执行语句;语句必须在函数内部才能有效。
有一些东西可以进入 全局范围:
- 命名空间声明和定义
- 全局变量声明
- 函数原型和定义
- 模板和class声明和定义
- 预处理器指令
必须在函数范围内的东西:
- if 和 for 等控制语句
- 标签
- 函数调用
最后,以上所列并非全部。
您的宏(在 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 说不要使用宏。事实上,他创建了常量、内联和某种程度上的模板,这样你就可以避免使用宏。 宏是邪恶的!!!!
有这个代码:
#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' 正在递增 在 函数之外,这是一个语法错误。
就像另一个答案所说的那样,您不能随心所欲地执行语句;语句必须在函数内部才能有效。
有一些东西可以进入 全局范围:
- 命名空间声明和定义
- 全局变量声明
- 函数原型和定义
- 模板和class声明和定义
- 预处理器指令
必须在函数范围内的东西:
- if 和 for 等控制语句
- 标签
- 函数调用
最后,以上所列并非全部。
您的宏(在 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 说不要使用宏。事实上,他创建了常量、内联和某种程度上的模板,这样你就可以避免使用宏。 宏是邪恶的!!!!