gpt4 book ai didi

c++ - 为什么我在C++中定义了 'epsilon'后不能包含标准算法库?

转载 作者:行者123 更新时间:2023-12-01 12:26:21 25 4
gpt4 key购买 nike

当我在定义 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/https://en.cppreference.com/w/cpp/algorithm没有提到任何名为“epsilon”的东西。我知道我可以通过在定义 epsilon 之前始终包含 来避免这个问题,我想知道是什么导致了这个错误,以扩大我对 C++ 的理解并防止将来出现这些类型的错误。
我在更新的 Windows 10(64 位)环境中使用 MinGW(32 位,几周前安装)进行编译。

最佳答案

允许标准库头文件包含任何其他标准库头文件。
可能是 <algorithm>包括 <limits> 并且存在 std::numeric_limits::epsilon() 那里。当然,宏会忽略命名空间和类,因此它会尝试声明一个名为 0.00001 的函数。 .
不要使用宏。使用 C++ 常量:

constexpr double epsilon = 0.00001;
如果您绝对需要宏,请始终在包含之后定义它们。之前定义它们会使您的代码非常脆弱 - 将来这些 header 中的任何更改都可能会因神秘的编译器错误而炸毁您的代码。
出于同样的原因,不要在头文件中定义宏。
尽可能使用非常本地化的宏 - 在需要的地方定义它们和 #undef完成后。这样它们就不会泄漏到外面(尽管您仍然可以无意中覆盖现有的宏)。

关于c++ - 为什么我在C++中定义了 'epsilon'后不能包含标准算法库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62916778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com