当我在定义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”的内容。 我知道只要始终包含
我在更新Windows10(64位)环境中使用MinGW(32位,几周前安装)进行编译。
标准库标头允许包括任何其他标准库标头。
可能包括
,并且存在std::numeric_limits::epsilon()
。 当然,宏会忽略名称空间和类,因此它会尝试声明一个名为0.00001
的函数。
不要使用宏。 使用C++常量:
constexpr double epsilon = 0.00001;
如果您绝对需要宏,请始终在包含之后定义它们。 以前定义它们会使您的代码变得非常脆弱--将来对这些头文件的任何更改都可能会使您的代码因隐藏的编译器错误而崩溃。
出于同样的原因,不要在头文件中定义宏。
如果可能,最好使用非常本地化的宏--在需要的地方定义它们,并在完成后定义#undef
。 这样它们就不会泄漏到外部(尽管您仍然可以无意中覆盖现有的宏)。