【发布时间】:2021-11-04 05:04:39
【问题描述】:
我需要将 C++98 用于大学课程,但是即使将 -std=c++98 标志传递给 clang++ 或 g++,它似乎仍然可以使用 c++11 编译,并且如果我不给出错误使用 c++11 功能。这是一个简单的例子:
#include <string>
#include <sstream>
using namespace std;
int main()
{
int i;
string number = "12";
i = stoi(number);
}
我的生成文件:
all:
clang++ -std=c++98 -c *.cpp
clang++ -o main *.o
clean:
rm -f *.o main
run: clean all
./main
然后我从终端运行命令 make(我尝试使用 clang++ 而不是 g++,但它产生相同的结果)并收到以下输出:
➜ cppversion make
g++ -std=c++98 -c *.cpp
g++ -o main *.o
➜ cppversion make
clang++ -std=c++98 -c *.cpp
clang++ -o main *.o
➜ cppversion
如果 -std=c++98 标志有效,我相信这段代码不应该编译。如何强制代码用 c++98 编译?
这里是clang的版本:
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin\
这里是g++的版本:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
我也尝试添加标志 -pedantic 但它不能解决问题。
使用标志 -stdlib=libc++ 会产生以下结果:
➜ cppversion make
clang++ -stdlib=libstdc++ -std=c++98 -c *.cpp
clang: warning: include path for libstdc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
main.cpp:1:10: fatal error: 'string' file not found
#include <string>
^~~~~~~~
1 error generated.
make: *** [all] Error 1
如果我将其更改为 -stdlib=libc++ 那么它仍然可以编译:
➜ cppversion make
clang++ -stdlib=libc++ -std=c++98 -c *.cpp
clang++ -o main *.o
➜ cppversion
我找到了一个简单的解决方案:使用 homebrew 安装 gcc 并使用 g++-11 编译。
【问题讨论】:
-
在这里失败(如预期) - 直播 - godbolt.org/z/r3od175Wh 你使用的是什么版本的 clang 和 g++?
-
您可以使用本网站生成make文件solver.assistedcoding.eu/makefilegen
-
@RichardCritten 我已经添加了 clang 和 g++ 的版本