왜`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-errors
GCC에서 사용 하면 C 코드에서도 "오류"가 발생합니다. ( -pedantic-errors
단순히 모든 "경고"를 "오류"로 전환 하는 것은 아닙니다. 실제 제약 조건 위반 만 "오류"로보고하려고 시도합니다 .)
선언 구문은 다음과 같이 정의됩니다 ( init-declarator-list 및 init-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
'code' 카테고리의 다른 글
Entity Framework 코드 첫 번째 AddOrUpdate 메서드 삽입 중복 값 (0) | 2020.12.25 |
---|---|
집합의 순열 생성 (가장 효율적) (0) | 2020.12.25 |
연결할 수없는 코드가 잘 작동합니다.-어떻게? (0) | 2020.12.24 |
jQuery는 "선택자"의 캐싱을 수행합니까? (0) | 2020.12.24 |
Java에서 Void 클래스의 필요성은 무엇입니까? (0) | 2020.12.24 |