为什么在C++中定义了'epsilon'后不能包含标准算法库?
Why can't I include the standard algorithm library after defining 'epsilon' in C++?
当我在定义 epsilon 之前包含算法库时,编译了以下代码:
#include <iostream>
#include <algorithm>
#define epsilon 0.00001
int main() {
std::cout << epsilon;
return 0;
}
当我切换它们时,它不会:
#include <iostream>
#define epsilon 0.00001
#include <algorithm>
int main() {
std::cout << epsilon;
return 0;
}
出现以下错误 19 次:
epsilon_algorithm.cpp:3:17: error: expected unqualified-id before numeric constant
3 | #define epsilon 0.00001
|
在 http://www.cplusplus.com/reference/algorithm/ and https://en.cppreference.com/w/cpp/algorithm 上没有提到任何名为 'epsilon' 的东西。我知道我可以通过在定义 epsilon 之前总是包含 来避免这个问题,我想知道是什么导致了这个错误,以扩大我对 C++ 的理解并防止将来出现这些类型的错误。
我在更新的 Windows 10(64 位)环境中使用 MinGW(32 位,几周前安装)进行编译。
标准库 header 可以包含任何其他标准库 header。
<algorithm>
可能包含 <limits>
and there exists std::numeric_limits::epsilon()
。当然,宏会忽略名称空间和 类,因此它会尝试声明一个名为 0.00001
.
的函数
不要使用宏。使用 C++ 常量:
constexpr double epsilon = 0.00001;
如果您绝对需要宏,请始终在 全部包含之后定义它们。之前定义它们会使您的代码变得非常脆弱 - 将来对这些 header 的任何更改都可能会导致您的代码因神秘的编译器错误而崩溃。
出于同样的原因,不要在 header 文件中定义宏。
尽可能使用非常本地化的宏 - 在需要的地方定义它们,并在完成后 #undef
。这样它们就不会泄漏到外面(尽管您仍然可以无意中覆盖现有的宏)。
当我在定义 epsilon 之前包含算法库时,编译了以下代码:
#include <iostream>
#include <algorithm>
#define epsilon 0.00001
int main() {
std::cout << epsilon;
return 0;
}
当我切换它们时,它不会:
#include <iostream>
#define epsilon 0.00001
#include <algorithm>
int main() {
std::cout << epsilon;
return 0;
}
出现以下错误 19 次:
epsilon_algorithm.cpp:3:17: error: expected unqualified-id before numeric constant
3 | #define epsilon 0.00001
|
在 http://www.cplusplus.com/reference/algorithm/ and https://en.cppreference.com/w/cpp/algorithm 上没有提到任何名为 'epsilon' 的东西。我知道我可以通过在定义 epsilon 之前总是包含
我在更新的 Windows 10(64 位)环境中使用 MinGW(32 位,几周前安装)进行编译。
标准库 header 可以包含任何其他标准库 header。
<algorithm>
可能包含 <limits>
and there exists std::numeric_limits::epsilon()
。当然,宏会忽略名称空间和 类,因此它会尝试声明一个名为 0.00001
.
不要使用宏。使用 C++ 常量:
constexpr double epsilon = 0.00001;
如果您绝对需要宏,请始终在 全部包含之后定义它们。之前定义它们会使您的代码变得非常脆弱 - 将来对这些 header 的任何更改都可能会导致您的代码因神秘的编译器错误而崩溃。
出于同样的原因,不要在 header 文件中定义宏。
尽可能使用非常本地化的宏 - 在需要的地方定义它们,并在完成后 #undef
。这样它们就不会泄漏到外面(尽管您仍然可以无意中覆盖现有的宏)。