提问者:小点点

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


当我在定义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++的理解,并防止将来出现这些类型的错误。

我在更新Windows10(64位)环境中使用MinGW(32位,几周前安装)进行编译。


共1个答案

匿名用户

标准库标头允许包括任何其他标准库标头。

可能包括,并且存在std::numeric_limits::epsilon()。 当然,宏会忽略名称空间和类,因此它会尝试声明一个名为0.00001的函数。

不要使用宏。 使用C++常量:

constexpr double epsilon = 0.00001;

如果您绝对需要宏,请始终在包含之后定义它们。 以前定义它们会使您的代码变得非常脆弱--将来对这些头文件的任何更改都可能会使您的代码因隐藏的编译器错误而崩溃。
出于同样的原因,不要在头文件中定义宏。
如果可能,最好使用非常本地化的宏--在需要的地方定义它们,并在完成后定义#undef。 这样它们就不会泄漏到外部(尽管您仍然可以无意中覆盖现有的宏)。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|定义|epsilon|包含|标准|算|法库)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?