Clang 在 c++98 模式下使用 std::stoi 编译代码

问题描述 投票:0回答:1

我需要用 C++98 编译我的 cpp,而不是我的学校项目的 C++11。 所以我用

-std=c++98
来编译:

CPPFLAGS = -Wall -Werror -Wextra -std=c++98

但是我犯了一个错误,使用了 C++11

std::stoi
函数。

i = std::stoi(index);

我尝试不使用

-std=c+=98 flag
,但它没有改变任何东西。 我正在使用 MAC 10.12.6

我的代码编译时没有任何警告或任何错误。

如果我没记错的话,clang 应该因为我使用 C++11 函数而大喊大叫。 为什么?

编辑 clang 版本:

Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
c++ c++11 clang++ c++98
1个回答
0
投票

因为 -std 标志代表“语言标准”,所以“标准库”是一个单独的东西。可能您使用的编译器默认使用 libc++ 标准库。当您从 -std 标志获得低于 c++11 的值时,libc++ (llvm std.lib.) 仍使用 c++11 标准库。 libc++ 归 llvm 所有。如果你想使用 gnu 标准 c++ 库 (libstdc++),你必须使用标志 -stdlib=libstdc++。否则它使用 -stdlib=libc++ 默认。使用 libstdc++ 解决了我的问题。 gnu c++ 标准。库。支持98标准,llvm c++ std。库。提供对 98 标准的向后兼容性

__cplusplus 从 -std 标志获取的值(对于 98 -> 199711L)

我在这里看到libc++使用98的11标准

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__config

#ifndef _LIBCPP_STD_VER
#  if  __cplusplus <= 201103L
#    define _LIBCPP_STD_VER 11
#  elif __cplusplus <= 201402L
#    define _LIBCPP_STD_VER 14
#  elif __cplusplus <= 201703L
#    define _LIBCPP_STD_VER 17
#  else
#    define _LIBCPP_STD_VER 18  // current year, or date of c++2a ratification
#  endif
#endif  // _LIBCPP_STD_VER
© www.soinside.com 2019 - 2024. All rights reserved.