2016-07-18 2 views
2

내가 아니라 6.9 절에서 번역 단위의 문법을 찾을 수 있습니다 :이 문법에서C11에서 빈 번역 단위에 대해 언급하고 있습니까? 그렇다면 어떤 섹션에 있습니까? (가) 다음과 같이

translation-unit: external-declaration 
        translation-unit external-declaration 

, 의미 적어도 하나의 외부 선언이 있어야한다 보인다 빈 번역 단위가 허용되지 않습니다. 그러나 컴파일러가 이러한 시나리오를 수행하는 데 필요한 것이 무엇인지 알고 싶습니다. 어떤 사람이 C11의 설명에 나를 가리킬 수 있습니까?

+1

표준에서 명시 적으로 정의되지 않은 경우 정의에 따라 정의되지 않은 동작입니다. – rubenvb

+0

"기본"정의되지 않은 동작을 의미합니까? –

+0

@rubenvb : 정의되지 않은 동작이 아니라 구문 오류입니다. –

답변

2

번역 단위의 정의에서 빈 원본 파일을 번역 단위로 처리하면 구문 오류가 발생합니다.

C11 표준의 5.1.1.3 절 (N1570 draft 참조)에는 구문 규칙이나 제약 조건을 위반하는 번역 단위에 대한 진단이 필요합니다. 진단 프로그램이 치명적이지 않은 경고이고 구현이 어쨌든이를 변환하면 결과 동작은 누락 (4p2)으로 정의되지 않습니다. 구현이 진단 메시지를 발행하지 못하면, 구현은 (적어도 당신이 그것을 호출 한 모드에서) 부적합하며, 표준은 그것에 대해 더 이상 말하지 않습니다.

특정 구현의 동작이 언어 표준이 말하는 것에 대한 질문에 직접 대답하지는 않지만 gcc와 clang이 빈 소스 파일 (C11을 따르려고 시도 할 수있는 옵션 포함)에 대해 수행하는 작업은 다음과 같습니다.

$ gcc -c -std=c11 -pedantic-errors empty.c 
empty.c:1:0: error: ISO C forbids an empty translation unit [-Wpedantic] 
$ clang -c -std=c11 -pedantic-errors empty.c 
empty.c:1:1: error: ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit] 
^ 
1 error generated. 
$