我需要用 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
因为 -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