为什么在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 。这样它们就不会泄漏到外面(尽管您仍然可以无意中覆盖现有的宏)。