Vô hiệu hóa C ++ 11 trong GCC 7.3


11

Có vẻ như trong Ubuntu 18.04, g ++ mặc định được vận chuyển (phiên bản 7.3.0) chạy ở chế độ tương thích C ++ 11 theo mặc định. Tôi nhận được một số lỗi trong các mã cũ không tương thích với C ++ 11. Tôi đã cài đặt g ++ - 6 (phiên bản 6.4.0) và các chương trình đang biên dịch tốt. Có thể tắt chế độ C ++ 11 trong g ++ - 7 không?


2
Trên thực tế, chế độ mặc định của GCC 6 đã là C ++ 14 . GCC 7 bổ sung hỗ trợ C ++ 17; Có lẽ chỉ cần vô hiệu hóa thứ C ++ 17 này. Không cần quay lại C ++ 11. Quay trở lại C ++ 98 thực sự là quá mức cần thiết (chưa đủ?)
MSalters

5
Bạn đã làm gì trong các chương trình cũ không tương thích? Bạn có thể đã có thể làm những việc bạn không được phép ở nơi đầu tiên do lỗi. Trong trường hợp đó, bạn sẽ không đạt được bất cứ điều gì từ việc chuyển sang c ++ 98.
whn

9
@snb: Hoặc họ đã sử dụng std::auto_ptr, hoặc họ đã sử dụng autotrong chiêu bài ban đầu của nó, hoặc họ có chuyển đổi hẹp bây giờ bất hợp pháp, hoặc họ đã sử dụng export, hay, hoặc, hoặc
Lightness Races ở Orbit


2
@LightnessRacesinOrbit Hầu hết điều đó sẽ là thực hành kém trước C ++ 11.
whn

Câu trả lời:


20

Hãy thử thêm -std=gnu++98, nó có thể là mặc định cho gcc 6.4.0.

Thí dụ:

g++ -std=gnu++98 hello.cpp -o hello

5
Nếu bạn cần ABI khả năng tương thích với mã biên soạn bởi GCC cũ, bạn sẽ muốn -D_GLIBCXX_USE_CXX11_ABI=0cũng
Tavian Barnes

2
Hoặc -std=gnu++03cho tiêu chuẩn cuối cùng trước C ++ 11. Cũng đáng đề cập rằng -std=c++03sẽ vô hiệu hóa một số phần mở rộng GNU không tương thích với ISO C ++ nghiêm ngặt.
Peter Cordes

1
Trên trình thám hiểm trình biên dịch Godbolt, C ++ 14 là mặc định cho g ++ 6.3 godbolt.org/g/x2xPCS . C ++ 98 là mặc định cho g ++ 5.5 trở lên. Tôi đã kiểm tra giá trị của __cplusplus: Làm thế nào để xác định phiên bản của tiêu chuẩn C ++ được trình biên dịch sử dụng?
Peter Cordes

1

Từ man g++bạn có thể chọn giữa các phương ngữ khác nhau:

Options Controlling C Dialect
   The following options control the dialect of C (or languages derived
   from C, such as C++, Objective-C and Objective-C++) that the compiler
   accepts:

  -ansi
       In C mode, this is equivalent to -std=c90. In C++ mode, it is
       equivalent to -std=c++98.

       This turns off certain features of GCC that are incompatible with
       ISO C90 (when compiling C code), or of standard C++ (when compiling
       C++ code), such as the "asm" and "typeof" keywords, and predefined
       macros such as "unix" and "vax" that identify the type of system
       you are using.  It also enables the undesirable and rarely used ISO
       trigraph feature.  For the C compiler, it disables recognition of
       C++ style // comments as well as the "inline" keyword.

  -std=
       Determine the language standard.   This option is currently only
       supported when compiling C or C++.

       The compiler can accept several base standards, such as c90 or
       c++98, and GNU dialects of those standards, such as gnu90 or
       gnu++98.  When a base standard is specified, the compiler accepts
       all programs following that standard plus those using GNU
       extensions that do not contradict it.  For example, -std=c90 turns
       off certain features of GCC that are incompatible with ISO C90,
       such as the "asm" and "typeof" keywords, but not other GNU
       extensions that do not have a meaning in ISO C90, such as omitting
       the middle term of a "?:" expression. On the other hand, when a GNU
       dialect of a standard is specified, all features supported by the
       compiler are enabled, even when those features change the meaning
       of the base standard.  As a result, some strict-conforming programs
       may be rejected.  The particular standard is used by -Wpedantic to
       identify which features are GNU extensions given that version of
       the standard. For example -std=gnu90 -Wpedantic warns about C++
       style // comments, while -std=gnu99 -Wpedantic does not.

       A value for this option must be provided; possible values are

       c90
       c89
       iso9899:1990
           Support all ISO C90 programs (certain GNU extensions that
           conflict with ISO C90 are disabled). Same as -ansi for C code.

       iso9899:199409
           ISO C90 as modified in amendment 1.

       c99
       c9x
       iso9899:1999
       iso9899:199x
           ISO C99.  This standard is substantially completely supported,
           modulo bugs and floating-point issues (mainly but not entirely
           relating to optional C99 features from Annexes F and G).  See
           <http://gcc.gnu.org/c99status.html> for more information.  The
           names c9x and iso9899:199x are deprecated.

       c11
       c1x
       iso9899:2011
           ISO C11, the 2011 revision of the ISO C standard.  This
           standard is substantially completely supported, modulo bugs,
           floating-point issues (mainly but not entirely relating to
           optional C11 features from Annexes F and G) and the optional
           Annexes K (Bounds-checking interfaces) and L (Analyzability).
           The name c1x is deprecated.

       gnu90
       gnu89
           GNU dialect of ISO C90 (including some C99 features).

       gnu99
       gnu9x
           GNU dialect of ISO C99.  The name gnu9x is deprecated.

       gnu11
       gnu1x
           GNU dialect of ISO C11.  This is the default for C code.  The
           name gnu1x is deprecated.

       c++98
       c++03
           The 1998 ISO C++ standard plus the 2003 technical corrigendum
           and some additional defect reports. Same as -ansi for C++ code.
       gnu++98
       gnu++03
           GNU dialect of -std=c++98.

       c++11
       c++0x
           The 2011 ISO C++ standard plus amendments.  The name c++0x is
           deprecated.

       gnu++11
       gnu++0x
           GNU dialect of -std=c++11.  The name gnu++0x is deprecated.

       c++14
       c++1y
           The 2014 ISO C++ standard plus amendments.  The name c++1y is
           deprecated.

       gnu++14
       gnu++1y
           GNU dialect of -std=c++14.  This is the default for C++ code.
           The name gnu++1y is deprecated.

       c++1z
           The next revision of the ISO C++ standard, tentatively planned
           for 2017.  Support is highly experimental, and will almost
           certainly change in incompatible ways in future releases.

       gnu++1z
           GNU dialect of -std=c++1z.  Support is highly experimental, and
           will almost certainly change in incompatible ways in future
           releases.
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.