-std=c++ 98 和 OS X 10.10
-std=c++ 98 and OS X 10.10
我目前正尝试在 OS X 10.10:
上使用 -std=c++98 标志编译我的程序
clang++ -std=c++98 -pedantic -W -Wall -Werror *.cpp
g++ -std=c++98 -pedantic -W -Wall -Werror *.cpp
奇怪的是,当我用 OS 10.10 编译时没有显示错误,而有些是用 GNU/Linux 发行版显示的。
使用 GNU/Linux 发行版我有一些错误,因为我使用 s.open(file);
而不是 s.open(file.c_str());
但是在 OS X 上没有错误,即使使用 s.open(file);
.
也许这个错误和每个OS的文件系统之间只有一个link?
你是对的。此代码不应在 C++98 下编译:
#include <fstream>
#include <string>
int main() {
std::string file("/tmp/foo.txt");
std::ifstream s;
s.open(file);
}
从技术上讲,这是 libc++ 中的一个错误,但我怀疑他们会想要修复它。
如果你愿意,你可以使用 libstdc++ 作为标准库进行编译,它没有实现此功能(至少 apple 分发的版本没有)。
[10:13am][wlynch@watermelon /tmp] clang++ -std=c++98 -stdlib=libstdc++ foo.cc
foo.cc:7:12: error: no viable conversion from 'std::string' (aka 'basic_string<char>') to 'const char *'
s.open(file);
^~~~
/usr/include/c++/4.2.1/fstream:518:24: note: passing argument to parameter '__s' here
open(const char* __s, ios_base::openmode __mode = ios_base::in)
^
1 error generated.
问题是,在 OS X 上,您仍在使用标准库的 C++11 实现,其中包括 API 更改,例如 ostream::open
方法接受std::strings
.
使用 -std=c++98
更改 C++ 标准不会影响正在使用的标准库,并且 libc++ 不会实现 C++98(例如,没有 #ifdef 来删除那些 open(std::string)
APIs 在 C++98 模式下)而我认为 libstdc++ 在 C++98 模式下构建时确实隐藏了非 C++98 APIs。
我目前正尝试在 OS X 10.10:
上使用 -std=c++98 标志编译我的程序clang++ -std=c++98 -pedantic -W -Wall -Werror *.cpp
g++ -std=c++98 -pedantic -W -Wall -Werror *.cpp
奇怪的是,当我用 OS 10.10 编译时没有显示错误,而有些是用 GNU/Linux 发行版显示的。
使用 GNU/Linux 发行版我有一些错误,因为我使用 s.open(file);
而不是 s.open(file.c_str());
但是在 OS X 上没有错误,即使使用 s.open(file);
.
也许这个错误和每个OS的文件系统之间只有一个link?
你是对的。此代码不应在 C++98 下编译:
#include <fstream>
#include <string>
int main() {
std::string file("/tmp/foo.txt");
std::ifstream s;
s.open(file);
}
从技术上讲,这是 libc++ 中的一个错误,但我怀疑他们会想要修复它。
如果你愿意,你可以使用 libstdc++ 作为标准库进行编译,它没有实现此功能(至少 apple 分发的版本没有)。
[10:13am][wlynch@watermelon /tmp] clang++ -std=c++98 -stdlib=libstdc++ foo.cc
foo.cc:7:12: error: no viable conversion from 'std::string' (aka 'basic_string<char>') to 'const char *'
s.open(file);
^~~~
/usr/include/c++/4.2.1/fstream:518:24: note: passing argument to parameter '__s' here
open(const char* __s, ios_base::openmode __mode = ios_base::in)
^
1 error generated.
问题是,在 OS X 上,您仍在使用标准库的 C++11 实现,其中包括 API 更改,例如 ostream::open
方法接受std::strings
.
使用 -std=c++98
更改 C++ 标准不会影响正在使用的标准库,并且 libc++ 不会实现 C++98(例如,没有 #ifdef 来删除那些 open(std::string)
APIs 在 C++98 模式下)而我认为 libstdc++ 在 C++98 模式下构建时确实隐藏了非 C++98 APIs。