C++ -std=c++;98和OS X 10.10

C++ -std=c++;98和OS X 10.10,c++,macos,g++,osx-yosemite,clang++,C++,Macos,G++,Osx Yosemite,Clang++,我目前正试图在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(文件)而不是s.open(file.c_str())但在OSX

我目前正试图在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(文件)
而不是
s.open(file.c_str())
但在OSX上没有错误,即使使用
s.open(文件)


也许这个错误和每个操作系统的文件系统之间只有一个链接?

你是对的。此代码不应在C++98下编译:

#include <fstream>
#include <string>

int main() {
    std::string file("/tmp/foo.txt");
    std::ifstream s;
    s.open(file);
}
#包括
#包括
int main(){
字符串文件(“/tmp/foo.txt”);
std::ifs流;
s、 打开(文件);
}

从技术上讲,这是libc++中的一个bug,但我怀疑他们是否愿意修复这个bug

如果您愿意,可以使用libstdc++作为标准库进行编译,该库没有实现此功能(至少苹果发行的版本没有)

[10:13am][wlynch@watermelon/tmp]clang++-std=c++98-stdlib=libstdc++foo.cc
foo.cc:7:12:错误:从'std::string'(也称为'basic_string')到'const char*'没有可行的转换
s、 打开(文件);
^~~~
/usr/include/c++/4.2.1/fstream:518:24:注意:在此处将参数传递给参数'\u's'
打开(常量字符*\uuuu s,ios\u基::openmode\uuuu模式=ios\u基::in)
^
生成1个错误。

问题在于,在OSX上,您仍然在使用标准库的C++11实现,其中包括诸如
ostream::open
方法接受
std::strings
等API更改


< > >将C++标准与 > STD= C++ 98 >不影响使用的标准库,LIbc++不实现C++ 98(例如,在C++ C++ 98模式下,没有任何IFDEF来删除那些<代码>打开(STD::String) API),而我认为LBSTDC++在C++ 98模式下确实隐藏了非C++ 98 API。错误?你能举个例子吗?太好了。因此,我只需要添加
-stdlib=libstdc++
标志,使其具有与GNU/Linux相同的错误。请注意,如果您尝试链接apple提供的库,在程序中使用libstdc++可能会出现问题。请参阅:“从技术上讲,这是libc++中的一个bug”这不是libc++中的bug,只是libc++没有实现c++98。
[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.