38

我在家里用 xcode 在我的 mac 上编译了这段代码,没有任何问题。我在学校用 linux 上的 g++ 编译它,我得到了这些错误:

numeric_limits' 不是 std 的成员

'>' 之前的预期主表达式 令牌

调用 'max()' 没有匹配的函数</p>

#include <iostream>
#include <cstdlib>

using namespace std;

int GetIntegerInput(int lower, int upper)
{
    int integer = -1;
    do
    {
        cin >> integer;
        cin.clear();
        cin.ignore(std::numeric_limits<streamsize>::max(), '\n');  //errors here
    } while (integer < lower || integer > upper);

    return integer;
}

我猜也许我必须包含一个额外的标题。如果我拿走std::它只会给我一个类似的错误:

numeric_limits在这方面没有申明

4

2 回答 2

73

您需要包含头文件<limits>,这std::numeric_limits是定义的位置。您的 Mac 编译器通过自动包含该头文件来帮助您;但是,您不应依赖该行为并明确包含您需要的任何头文件。

于 2011-01-25T21:20:50.107 回答
6

根据https://www.gnu.org/software/gcc/gcc-11/porting_to.html#header-dep-changes,GCC 11 开始明确要求包括<limits>, <memory>, <utility>,<thread>

与 Clang 12 相同或相似的故事(或更早,我不知道)。

由于我在使用(Node.js 的包管理器)时(经常)遇到此错误yarn并且它每次都会覆盖所有源文件,因此我无法轻松添加:在编译过程中#include <limits>我需要分叉或垃圾邮件。cp /tmp/fixedBad.h /installdir/bad.h

因此我的解决方案是添加到 CXXFLAGS(不是 CFLAGS)这个:

-include /usr/include/c++/11/limits(Ubuntu 21.04, gcc 11.1.0)

-include /usr/include/c++/11.1.0/limits(Arch Linux;版本相同,但路径与 Debian/Ubuntu 不同)

或优雅地:-include /usr/include/c++/11*/limits

请注意,*仅当由 shell(bash、sh、zsh 等)或 makefile 使用时才有效。换句话说,gcc 和 clang 不注意*文件路径,所以如果你使用ninja build或直接从例如 C 程序向 gcc/clang 传递参数,请注意。

我有这个/etc/environment

#CPPFLAGS="-D_FORTIFY_SOURCE=2 -DNDEBUG"
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong"
CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
RUSTFLAGS="-C target-cpu=native -C opt-level=2"

检查echo $CXXFLAGS,如果未应用更改,请重新启动 shell 或操作系统,或注销当前 tty,或切换到另一个 tty,或仅在终端中运行:

export CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"

或者set -a; source /etc/environment; set +a;

我也尝试添加到 CXXFLAGS-include '<limits>'-include '<limits.h>',但它说“没有这样的文件或目录”

我还有另一个解决方案(很脏):

在最后一行 ( ) 之前将其添加到/usr/include/stdint.h(或其他一些流行的文件):stdlib.h#endif

#ifdef __cplusplus
extern "C++" {
       #include <limits>
}
#endif

Ubuntu 21.04 和 Debian Busterdpkg-query -S /usr/include/stdlib.h 说它归libc6-dev:amd64. Arch Linuxpacman -Qo /usr/include/stdlib.h说它归glibc. 因此,当软件包更新时,此 hack 将被覆盖,不要忘记。

于 2021-06-27T09:08:15.090 回答