programing

왜 'int'는 C++에서는 정상적으로 컴파일되지만 C++에서는 컴파일되지 않는가?

prostudy 2022. 5. 28. 09:04
반응형

왜 'int'는 C++에서는 정상적으로 컴파일되지만 C++에서는 컴파일되지 않는가?

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

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

컴파일러 gcc 4.8.1은 다음 경고를 보냅니다.

[경고] 빈 선언에 사용할 수 없는 유형 이름 [기본적으로 사용 가능]

컴파일이 잘 되는 이유는 무엇입니까?컴파일러 오류가 뜨지 않나요?G++ 4.8.1을 C++ 프로그램으로 컴파일하면 다음과 같은 오류가 발생합니다.

[오류] 선언은 아무것도 선언하지 않는다[허용]

C기준에 따르면

static_assert 선언 이외의 선언은 적어도 선언자(함수의 파라미터 또는 구조체 또는 조합의 멤버 제외), 태그 또는 열거의 멤버를 선언해야 한다.

C++가 말한다.

단순 선언에서는 옵션의 init-declarator-list를 생략할 수 있는 것은 클래스(Clause 9) 또는 열거를 선언하는 경우뿐입니다.

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

코드는 C와 C++ 모두에서 불법입니다(오류, 잘못된 형식, 제약 조건 위반).어떤 언어로 "경고"가 발생하고 다른 언어로 "오류"가 발생하는 이유는 컴파일러와 컴파일러 설정의 문제일 뿐입니다.결국, 어느 언어도 공식적으로 "경고"와 "오류"를 구분하지 않습니다.디폴트 설정에서의 GCC는 (대부분의 이력상의 이유로) C모드에서 허용도가 높아집니다.

사용하다-pedantic-errors또, 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

declaration-specificator는 재귀적으로 정의되지만 각각 opt가 있는 것은 옵션임을 나타냅니다.

또한 다음 조항 6은 다음과 같이 기술되어 있다.

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

단어가 있으면 적어 둡니다.

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

반응형