为什么 c++ 命名空间中的定义在命名空间之外工作
Why the defines inside a c++ namespace works outside the namespace?
如果我在命名空间中使用一些宏定义,那么它们为什么要在命名空间之外工作?例如,检查此代码:
#include <bits/stdc++.h>
namespace foo {
#define a x*2
int f(int x) {
return a;
}
}
int main() {
int a = 50;
std::cout << a << endl;
std::cout << foo::f(4) << endl;
return 0;
}
在这里,我从未使用命名空间 foo 编写过。但是这段代码仍然没有被编译,因为当尝试声明 int a 时,它会受到先前定义的 a 的干扰。但为什么要这样做呢?
"...当尝试声明 int a 时,它会受到先前定义的 A 的干扰。但为什么要这样呢?
#define
语句由没有命名空间(或任何其他 C++ 语言构造)概念的 c/c++ 预处理器解释。
如果要限制定义的范围,请使用 #undef
指令:
namespace foo {
#define a x*2
int f(int x) {
return a;
}
#undef a
// ^^^^^^^^
}
预处理器不知道任何高级语言功能,如命名空间或作用域。它只是查找以#
开头的行,然后进行简单的文本替换。这就是为什么将预处理器用于除#include
或文件保护之外的任何内容在C++中都是危险的一个原因。
#define
不尊重任何C++范围。没有"local" #define
这样的东西.它将一直有效,直到它被#undef-ed
。
namespace foo {
#define a x*2
int f(int x) {
return a;
}
#undef a <<<<<<<<<<<<<<<<<<<<<
}
C 预处理器几乎是它自己的一种语言。它首先执行。宏创建传递到实际 C/C++ 编译器的代码。每当使用宏时,请始终记住宏胜过一切,甚至是大括号。只有另一个预处理器指令(如 #undef)可以停止宏。
顺便说一句,您甚至可以在任何文本文件上单独使用 C 预处理器。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 不使用与左右停止工作命名空间 std 的简单比较
- 使用两个命名空间只能部分工作
- 即使在包含 std 命名空间之后,fstream 在 Visual Studio 2017 中也无法正常工作
- 如何让非成员在<N>命名空间中为自定义类工作 [C++17]
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 为什么 c++ 命名空间中的定义在命名空间之外工作
- 运算符重载解析在命名空间中工作
- 命名空间和私有变量如何在程序集中工作
- 为什么 <conio.h> 有时不起作用,并且在 C++ 中使用命名空间 std 可以工作