2014-09-15 35 views
6

Vì vậy, trong khóa học CSE của chúng tôi, chúng tôi có một tệp tiêu đề để sử dụng ngay bây giờ cho các chương trình mà chúng tôi đang viết.Biên dịch trong C++ 14

Thật không may tôi không thể lấy thiết bị đầu cuối để biên dịch bằng cách sử dụng tiêu đề đó, nó cung cấp cho khá một vài lỗi (biên dịch chỉ với 'g ++'). Ngoài ra, khi tôi đang ở trường đại học của tôi và tôi đang sử dụng PuTTY tôi nhận được các lỗi tương tự trong khi sử dụng tiêu đề này. Tuy nhiên, tôi không nhận được các lỗi khi biên dịch với 'g ++ -std = C++ 14'.

Tôi đã thử biên dịch bằng lệnh này trên thiết bị đầu cuối trên máy Mac của mình, nhưng nó cho biết nó không nhận ra phần C++ 14.

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

Bất kỳ trợ giúp nào về cách làm việc này sẽ được đánh giá cao. Hy vọng rằng tất cả điều này làm cho một số loại ý nghĩa.

Đây là lỗi tôi nhận được khi tôi biên dịch với tệp tiêu đề tôi đang nói đến trong thiết bị đầu cuối chỉ với 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. 

lỗi này không xảy ra và chương trình sẽ biên dịch hoàn toàn khi tôi sử dụng PuTTY và 'g ++ std = C++ 14'

+0

Có thể đăng tệp tiêu đề hoặc quá dài không? – APerson

+6

Thử '-std = C++ 1y' cho đến khi trình biên dịch được cập nhật. Vì dự thảo sơ bộ này đã được theo dõi đặc biệt tốt và chỉ giống như tiêu chuẩn cuối cùng, nên đủ tốt. – Deduplicator

+0

Bạn nên kiểm tra các phiên bản của tiêu chuẩn được hỗ trợ bởi phiên bản trình biên dịch của bạn. – Angew

Trả lời

4

Có rất nhiều sự thay đổi giữa các tiêu chuẩn C++, vì vậy những gì có giá trị trong một phiên bản không cần phải được sửa đổi.

g++ defaults to -std=gnu++98 for C++, là thập kỷ cũ C++ 98 tiêu chuẩn được tăng cường với phần mở rộng GNU (hầu hết trong số đó là tuân thủ).

Chọn bản sửa đổi thích hợp: -std=c++1y -pedantic là sự gần đúng gần với C++ 14.

What changes introduced in C++14 can potentially break a program written in C++11?

+0

Tôi đã sử dụng '-std = C++ 1y -pedantic' và nó vẫn xuất hiện với các lỗi mà tôi đã đề cập trước đây, thật không may. – Joe

+0

Đó có phải là "std_lib_facilities_4.h" tiêu đề bạn muốn nói không? Hãy thử một tiêu chuẩn lỗi thời. – Deduplicator

+0

Các tùy chọn trình biên dịch này '-std = C++ 1y -pedantic' hoạt động tốt cho tôi bằng cách sử dụng clang 3.6, cảm ơn câu trả lời của bạn. –

1

Nhìn vào những gì bạn nói rằng bạn đang phải sử dụng và định dạng tên của tập tin cpp, tôi nghĩ rằng tôi đang ở trong cùng một lớp. Một năm sau, có vẻ như, nhưng đây là giải pháp của tôi vì mục đích lưu trữ:

Tiêu đề std_lib_facilities.h đi kèm với sách giáo khoa Bjarne Stroustrup, "Lập trình: Nguyên tắc và thực tiễn sử dụng C++". Đối với những người không biết, Bjarne Stroustrup đã phát minh ra C++ (anh ấy có một ý tưởng khá hay về những gì anh ấy nói về). Ngẫu nhiên, cuốn sách là một cách tuyệt vời để học C++, nếu người ta dành thời gian để đọc nó. Tiêu đề std_lib_facilities.h chỉ là một tệp tiêu đề tiện lợi cho người mới bắt đầu trong C++, chứa liên kết tới tất cả các thư viện chuẩn được sử dụng trong sách giáo khoa, cũng như một số hàm trợ giúp giúp giải quyết các lỗi hoặc lỗi tiềm ẩn. (chẳng hạn như một hàm error() xử lý việc ném ngoại lệ đơn giản cho sinh viên, hoặc thêm một kiểm tra "ngoài giới hạn" cho các vectơ). Nó cuối cùng chỉ là một cách để cho phép sinh viên nhảy ngay vào mã mà không cần phải tìm hiểu chi tiết về tiêu đề. Stroustrup giữ cập nhật với C++ và do đó bao gồm một số thư viện yêu cầu tiêu chuẩn C++ 11. Bộ phận CSCE muốn sinh viên của mình (ít nhất là trong giai đoạn đầu này) để kết nối với hệ thống Unix của bộ và biên dịch từ đó, để tránh nhầm lẫn với việc tải xuống và cập nhật các trình biên dịch.

Tôi tình cờ đã có một vài lớp C++ trước đó, và do đó đã có g ++ được thiết lập trên máy tính xách tay Ubuntu của tôi. Tôi tránh bao gồm các std_lib_facilities càng lâu càng tốt vì tôi đã nhận được cùng một lỗi như Chủ đề Creator Joe, nơi g + + không nhận ra phần "C++ 11" (thủ công bao gồm các thư viện cần thiết làm việc tốt cho đến khi chúng tôi phải sử dụng một lớp từ sách giáo khoa đã sử dụng một trong các hàm trợ giúp của tiêu đề). Cuối cùng, tôi tìm thấy một chủ đề trợ giúp trực tuyến để tôi chỉ đơn giản cập nhật trình biên dịch g ++ lên 4.7 hoặc cao hơn, vì 4.6 và thấp hơn không hỗ trợ C++ 11 (hoặc, tất nhiên, C++ 14).Nó khá kì quặc so với bản cập nhật có thể được sử dụng trên Mac hoặc Windows, và tôi nghi ngờ quy trình chính xác sẽ áp dụng, nhưng đó là (?) Có thể là vấn đề: nó chỉ là phiên bản cũ hơn của g ++, và nó cần cập nhật để biên dịch C++ 11 trở lên. Tôi khuyên bạn nên tìm kiếm các cách cập nhật g ++/gcc cho Mac.

Nên, bạn biết, bất kỳ ai khác có vấn đề này vấp ngã điều này và chưa giải quyết được vấn đề của họ.

Các vấn đề liên quan