code

왜`int;`는 C에서는 잘 컴파일되지만 C ++에서는 컴파일되지 않습니까?

codestyles 2020. 12. 24. 23:46
반응형

왜`int;`는 C에서는 잘 컴파일되지만 C ++에서는 컴파일되지 않습니까?


다음 프로그램을 고려하십시오 ( 여기에서 라이브 데모 참조 ).

#include <stdio.h>
int main(void)
{
      int ;  // Missing variable name
      puts("Surprise");
}

내 컴파일러 gcc 4.8.1은 다음과 같은 경고를 표시합니다.

[경고] 빈 선언에 쓸모없는 유형 이름 [기본적으로 활성화 됨]

왜 잘 컴파일됩니까? 컴파일러 오류가 발생하지 않아야합니까? g ++ 4.8.1을 C ++ 프로그램으로 컴파일하면 다음 오류가 발생합니다.

[오류] 선언은 아무것도 선언하지 않습니다. [-fpermissive]


C 표준에 따르면

static_assert 선언 이외의 선언은 최소한 선언자 (함수 매개 변수, 구조체 또는 공용체의 멤버 제외), 태그 또는 열거 형 멤버를 선언해야합니다.

C ++ 말한다

단순 선언에서 선택적 init-declarator-list는 클래스 (Clause 9) 또는 열거를 선언 할 때만 생략 할 수 있습니다.

어느 언어로든이를 위반하려면 진단이 필요합니다. 표준은 컴파일러 오류 또는 경고에 대해 이야기하지 않습니다. 경고는 진단입니다.


귀하의 코드는 C와 C ++ 모두에서 불법입니다 (예 : 잘못된 형식, 잘못된 형식, 제약 조건 위반). 한 언어에서는 "경고"가, 다른 언어에서는 "오류"가 발생하는 이유는 컴파일러와 컴파일러 설정의 특성 때문입니다. 결국 두 언어 모두 "경고"와 "오류"를 공식적으로 구분하지 않습니다. 기본 설정에서 GCC는 C 모드에서 더 관대합니다 (주로 역사적 이유로).

-pedantic-errorsGCC에서 사용 하면 C 코드에서도 "오류"가 발생합니다. ( -pedantic-errors단순히 모든 "경고"를 "오류"로 전환 하는 것은 아닙니다. 실제 제약 조건 위반 만 "오류"로보고하려고 시도합니다 .)


선언 구문은 다음과 같이 정의됩니다 ( init-declarator-listinit-declarator 생략 ).

C11 6.7 선언

declaration:
    declaration-specifiers init-declarator-list opt ;
    static_assert-declaration
declaration-specifiers:
    storage-class-specifier declaration-specifiers opt
    type-specifier declaration-specifiers opt
    type-qualifier declaration-specifiers opt
    function-specifier declaration-specifiers opt
    alignment-specifier declaration-specifiers opt

참고 것을 선언 - 지정자 재귀 적으로 정의되어 있지만 각 선택 하는 것이 선택 사항입니다 나타냅니다.

또한 다음 6 항은 다음과 같습니다.

선언 지정자는 연결, 저장 기간 및 선언자가 나타내는 엔터티 유형의 일부를 나타내는 일련의 지정자로 구성됩니다. initdeclarator-list는 쉼표로 구분 된 선언자의 시퀀스이며, 각 선언자는 추가 유형 정보, 이니셜 라이저 또는 둘 다를 가질 수 있습니다. 선언자는 선언되는 식별자 (있는 경우)를 포함합니다 .

해당되는 경우 단어 를 기록합니다 .

참조 URL : https://stackoverflow.com/questions/33273550/why-does-int-compile-fine-in-c-but-not-in-c

반응형