Biên dịch C ++ 11 với g ++


367

Tôi đang cố gắng cập nhật trình biên dịch C ++ của mình lên C ++ 11. Tôi đã tìm kiếm một chút và tôi đã đi đến kết luận rằng tôi phải sử dụng cờ -std=c++0xhoặc -std=gnu++0x, nhưng tôi không biết nhiều điều về cờ. Ai giúp tôi với? (Tôi đang sử dụng Ubuntu 12.04.)

Đây là lỗi mà tôi nhận được từ trình biên dịch khi tôi cố gắng sử dụng một thư viện được bao gồm trong C ++ 11 (tức là mảng):

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

Tệp này yêu cầu hỗ trợ trình biên dịch và thư viện cho tiêu chuẩn ISO C ++ sắp tới, C ++ 0x. Hỗ trợ này hiện đang thử nghiệm và phải được bật với các tùy chọn trình biên dịch -std = c ++ 0x hoặc -std = gnu ++ 0x.


5
Trong phiên bản mới nhất, có lẽ bạn phải sử dụng -std=c++11thay thế. Có lẽ cả hai đều được cho phép.

6
Điều này bỏ lỡ rất nhiều bối cảnh. Hiển thị lệnh đầy đủ bạn đã thử (thậm chí có thể mã mẫu bạn đã cố biên dịch) và những gì thực sự thất bại.
KillianDS

4
@groupdaknok_t: cả hai nên được cho phép, đồng thời cũng có các tàu Ubuntu 12.04 g++-4.6(chỉ hỗ trợ -std=c++0x)
KillianDS

3
Thêm cờ ngay sau đó g++, vd g++ -std=c++0x _filename_ && ./a.out.
n. 'đại từ' m.

1
Đã qua bài đăng này, tìm kiếm thông báo lỗi có tiêu đề. Tôi đang làm việc với một dự án QMAKE, giải pháp cho tôi là thêm CONFIG + = c ++ 11 vào tệp .pro.

Câu trả lời:


529

Cờ (hoặc tùy chọn trình biên dịch) không là gì ngoài các đối số dòng lệnh thông thường được truyền cho trình biên dịch thực thi.

Giả sử bạn đang gọi g ++ từ dòng lệnh (terminal):

$ g++ -std=c++11 your_file.cpp -o your_program

hoặc là

$ g++ -std=c++0x your_file.cpp -o your_program

nếu những điều trên không hoạt động.


8
Đừng quên đặt -Wall -gngay saug++
Basile Starynkevitch

7
@BasileStarynkevitch: Tôi cũng sẽ thêm -Werror, không có lý do gì để không bắt đầu một dự án.
Matthieu M.

3
Hỗ trợ C ++ 11 tốt hơn là điều gây tranh cãi và chẩn đoán tốt hơn không trông tốt hơn nhiều trong những ngày này (trang của Clang mô tả họ sử dụng GCC 4.2 vốn là cổ) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
Có ai biết nếu / khi trình biên dịch C ++ sẽ hỗ trợ chuẩn C ++ 11 theo mặc định, nghĩa là không có cờ không?
Dennis

2
Và trong trường hợp bạn chưa biết, trong Visual C ++ chỉ cần sử dụng VC11 (Visual Studio 2012) trở lên để có các tính năng C ++ 11
gerrytan

44

Bạn có thể kiểm tra g++bằng lệnh của bạn :

which g++
g++ --version

điều này sẽ cho bạn biết trình biên dịch nào hiện đang được trỏ.

Để chuyển sang g++4.7 (giả sử rằng bạn đã cài đặt nó trong máy của mình), hãy chạy:

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

Sau đó chọn 2làm lựa chọn (Máy của tôi đã trỏ đến g++4.7, vì vậy *)

Khi bạn chuyển đổi trình biên dịch rồi lại chạy g++ --versionđể kiểm tra việc chuyển đổi đã xảy ra chính xác.

Bây giờ biên dịch chương trình của bạn với

g++ -std=c++11 your_file.cpp -o main

Có thể đáng nói là các phiên bản như g ++ 4.4 có thể đơn giản là quá cũ để thực hiện một số tính năng, vì vậy việc nâng cấp là cần thiết. Việc nâng cấp sẽ phụ thuộc vào hệ thống của bạn và tôi sẽ tránh các phương pháp tự biên dịch g ++ và thay thế trình biên dịch của hệ thống để tham khảo
Colin D

13

Ubuntu của bạn chắc chắn có phiên bản đủ gần đây của g ++. Cờ để sử dụng là -std=c++0x.


Làm thế nào bạn có thể nói rằng, anh ấy đang sử dụng Ubuntu? Chỉ tò mò muốn biết.
Shravan40

22
@ Shravan40 OP nói rõ ràng I'm using Ubuntu 12.04.trong câu hỏi.
Timothy Gu

10

Nếu bạn muốn giữ các phần mở rộng trình biên dịch GNU, hãy sử dụng -std = gnu ++ 0x thay vì -std = c ++ 0x. Đây là một trích dẫn từ trang người đàn ông:

Trình biên dịch có thể chấp nhận một số tiêu chuẩn cơ bản, chẳng hạn như c89 hoặc c ++ 98 và phương ngữ GNU của các tiêu chuẩn đó, chẳng hạn như gnu89 hoặc gnu ++ 98. Bằng cách chỉ định một tiêu chuẩn cơ sở, trình biên dịch sẽ chấp nhận tất cả các chương trình tuân theo tiêu chuẩn đó và các chương trình sử dụng các phần mở rộng GNU không mâu thuẫn với nó. Ví dụ: -std = c89 tắt một số tính năng nhất định của GCC không tương thích với ISO C90, chẳng hạn như từ khóa "asm" và "typeof", nhưng không phải là các phần mở rộng GNU khác không có ý nghĩa trong ISO C90, chẳng hạn như bỏ qua thuật ngữ giữa của một biểu thức "?:". Mặt khác, bằng cách chỉ định một phương ngữ GNU của một tiêu chuẩn, tất cả các tính năng hỗ trợ trình biên dịch đều được bật, ngay cả khi các tính năng đó thay đổi ý nghĩa của tiêu chuẩn cơ sở và một số chương trình tuân thủ nghiêm ngặt có thể bị từ chối. Tiêu chuẩn cụ thể được sử dụng bởi -pedantic để xác định các tính năng nào là các tiện ích mở rộng GNU được cung cấp cho phiên bản tiêu chuẩn đó. Ví dụ: std = gnu89 -pedantic sẽ cảnh báo về kiểu C ++ // bình luận, trong khi -std = gnu99 -pedantic thì không.


Và điều gì có được bạn, ngoài ?:toán tử nhị phân ? Phần mở rộng duy nhất khác xuất hiện trong tâm trí, các biểu thức cấu trúc, được hỗ trợ bởi khởi tạo danh sách C ++ 11. Trong mọi trường hợp, trích dẫn này chủ yếu liên quan đến C, không phải C ++.
Potatoswatter

9

Bạn có thể tham khảo liên kết sau để biết các tính năng được hỗ trợ trong phiên bản cụ thể của trình biên dịch. Nó có một danh sách đầy đủ các tính năng hỗ trợ trong trình biên dịch. Có vẻ GCC tuân theo tiêu chuẩn chặt chẽ và thực hiện trước bất kỳ trình biên dịch nào khác.

Về câu hỏi của bạn, bạn có thể biên dịch bằng cách sử dụng

  1. g++ -std=c++11 cho C ++ 11
  2. g++ -std=c++14 cho C ++ 14
  3. g++ -std=c++17 cho C ++ 17
  4. g++ -std=c++2ađối với C ++ 20, mặc dù tất cả các tính năng của C ++ 20 chưa được hỗ trợ, hãy tham khảo liên kết này để biết danh sách hỗ trợ tính năng trong GCC.

Danh sách thay đổi khá nhanh, hãy theo dõi danh sách, nếu bạn đang chờ tính năng cụ thể được hỗ trợ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.