C++14编译

7

在我的CSE课程中,我们被提供了一个头文件来编写程序。

不幸的是,当我使用该头文件编译终端时,会出现许多错误(只使用'g++'编译)。而且,当我在大学使用PuTTY时,也会出现相同的错误。 但是,如果我使用'g++ -std=c++14'编译,则不会出现这些错误。

我已经尝试在我的Mac终端上使用此命令进行编译,但它显示无法识别c++14部分。

dhcp-10-202-147-243:hw1pr1 Admin$ g++ -std=c++14 hw1pr1.cpp
error: invalid value 'c++14' in '-std=c++14'

任何关于如何让这个工作的帮助都将不胜感激。希望这些话有点意义。
下面是我在终端中使用g++编译头文件时遇到的错误。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ext/hash_map:212:5: warning: 
      Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
      [-W#warnings]
#   warning Use of the header <ext/hash_map> is deprecated.  Migrate to ...
    ^
In file included from read_first_name.cpp:1:
./std_lib_facilities_4.h:43:20: error: no matching function for call to object
      of type 'hash<char *>'
            return hash<char*>()(s.c_str());
                   ^~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ext/__hash:39:12: note: 
      candidate function not viable: 1st argument ('const value_type *'
      (aka 'const char *')) would lose const qualifier
    size_t operator()(char *__c) const _NOEXCEPT
           ^
In file included from read_first_name.cpp:1:
./std_lib_facilities_4.h:112:8: warning: comparison of unsigned expression < 0
      is always false [-Wtautological-compare]
                if (i<0||size()<=i) throw Range_error(i);
                    ~^~
./std_lib_facilities_4.h:118:8: warning: comparison of unsigned expression < 0
      is always false [-Wtautological-compare]
                if (i<0||size()<=i) throw Range_error(i);
                    ~^~
3 warnings and 1 error generated.

当我使用PuTTY和'g++ std=c++14'时,这个错误不会发生,程序将完全编译通过。


能否发布头文件,还是太长了? - APerson
6
尝试使用-std=c++1y,直到编译器更新。由于这个初步草案被很好地跟踪,并且与最终标准几乎相同,因此应该足够好。 - Deduplicator
你应该检查编译器版本支持的标准版本。 - Angew is no longer proud of SO
APerson,这个头文件有235行,不确定什么长度算太长,但我认为这已经算是了。 - Joe
1
@Joe 将其缩减为 MCVE 即最小可编译的头文件子集,仍然能够演示问题,然后发布。 - JBentley
显示剩余6条评论
2个回答

4

我用了“-std=c++1y -pedantic”编译选项,但仍然出现了我之前提到的错误。非常遗憾。 - Joe
那个“std_lib_facilities_4.h”头文件是你指的吗?试试一个过时的标准。 - Deduplicator
这些编译器选项“-std=c++1y -pedantic”在我使用clang 3.6时非常有效,感谢您的回答。 - Gabriel L.

1

看到你说的你需要使用的文件名格式,我想我们在同一类。一年后,看起来是这样的,但为了档案记录,这是我的解决方案:

std_lib_facilities.h头文件随Bjarne Stroustrup的教科书“使用C++编程原理和实践”一起提供。对于那些不知道的人,Bjarne Stroustrup发明了C++(他对自己所说的内容有很好的想法)。顺便说一句,这本书是学习C++的绝佳方式,如果有时间真正阅读它的话。std_lib_facilities.h头文件只是一个方便初学者使用的头文件,其中包含了教科书中使用的所有主要标准库的链接,以及一些帮助解决潜在错误或错误的辅助函数,或者只是方便学习的函数(例如,一个处理学生简单异常抛出的error()函数,或者为向量添加“越界”检查)。它最终只是一种允许学生直接进入代码而不必学习头文件具体信息的方法。 Stroustrup保持与C++的更新,并包括几个需要c++11标准的库。CSCE系希望其学生(至少在这门早期课程中)连接到该系所的Unix系统并从那里进行编译,以避免与下载和更新编译器混淆。

我之前已经上过几节C++课程,因此在我的Ubuntu笔记本电脑上已经安装了g++。我尽可能避免使用std_lib_facilities,因为我遇到了与话题创建者Joe相同的错误,即g++无法识别"c++11"部分(手动包含所需库可以正常工作,直到我们必须使用教科书中使用其中一个头文件助手函数的类)。最终,我在网上找到了一个帮助主题,建议我简单地将g++编译器更新到4.7或更高版本,因为4.6及以下版本不支持C++11(当然也不支持C++14)。与Mac或Windows上可能习惯的更新相比,它似乎有些复杂,而且我怀疑确切的过程可能并不适用,但那很可能是问题所在:它只是一个旧版本的g++,需要更新以编译C++11和更高版本。我建议搜索如何更新Mac上的g++/gcc的方法。

如果有其他人遇到这个问题,并且尚未解决他们的问题,可以看一下这篇文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接