GCC 7.3에서 C ++ 11 비활성화


11

우분투 18.04에서 기본 제공되는 g ++ (버전 7.3.0)은 기본적으로 C ++ 11 호환 모드에서 실행됩니다. 이전 코드에서 C ++ 11과 호환되지 않는 오류가 발생합니다. g ++-6 (버전 6.4.0)을 설치했으며 프로그램이 올바르게 컴파일되었습니다. g ++-7에서 C ++ 11 모드를 비활성화 할 수 있습니까?


2
실제로 GCC 6의 기본 모드는 이미 C ++ 14 입니다. GCC 7은 C ++ 17 지원을 추가합니다. 이 C ++ 17을 비활성화하는 것으로 충분합니다. C ++ 11로 돌아갈 필요가 없습니다. C ++ 98로 돌아가는 것은 실제로 엄청난 과잉 (underkill?)
MSalters

5
호환되지 않는 이전 프로그램에서 무엇을 했습니까? 버그로 인해 처음에는 허용되지 않은 작업을 수행했을 수 있습니다. 이 경우 c ++ 98로 이동하면 아무것도 얻지 못합니다.
whn

9
@snb : 아니면 사용 std::auto_ptr하거나 사용 auto원래의 모습으로, 또는 그들이 지금 불법 축소 변환을 가지고, 또는 사용 export하거나, 또는, 또는
밝기 경주 궤도에


2
@LightnessRacesinOrbit이 중 대부분은 C ++ 11 이전에는 좋지 않은 연습이었습니다.
whn

답변:


20

를 추가해보십시오. -std=gnu++98아마도 gcc 6.4.0의 기본값이었습니다.

예:

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

5
오래된 GCC가 컴파일 한 코드와 ABI 호환성이 필요하다면, 당신도 원할 -D_GLIBCXX_USE_CXX11_ABI=0것입니다
Tavian Barnes

2
또는 -std=gnu++03C ++ 11 이전의 마지막 표준입니다. 또한 -std=c++03엄격한 ISO C ++와 호환되지 않는 일부 GNU 확장을 비활성화 할 수 있다는 점도 언급 할 가치가 있습니다.
Peter Cordes

1
Godbolt 컴파일러 탐색기에서 C ++ 14는 g ++ 6.3 godbolt.org/g/x2xPCS 의 기본값입니다 . C ++ 98은 g ++ 5.5 이하의 기본값입니다. 나는 값 확인 __cplusplus: 어떻게 컴파일러에 의해 사용되는 C ++ 표준의 버전을 확인하는가?
Peter Cordes

1

로부터 man g++서로 다른 방언 사이에서 선택할 수 있습니다 :

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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.