2017-02-27 1 views
0

GCC 컴파일러에서 컴파일 된 프로그램에 놀랐습니다. 성공적으로 작동했습니다. 컴파일러는 경고 만줍니다.C에서 extern 키워드의 동작

warning: 'i' initialized and declared 'extern' [enabled by default] extern int i = 10;^

내 코드 :

#include <stdio.h> 
//Compiler version gcc 4.9 
extern int i = 10; 
int main() 
{ 
    printf("%d\n",i); 
    return 0; 
} 

출력 :

10 

왜 포기하지 않는 컴파일러 오류? 정의되지 않은 동작입니까?

+0

중복 가능성 http://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c – 0xAX

답변

-1

주 기능 본문을 헤더에 넣지 말고 .c 파일에 넣어야합니다. 그 반대의 경우에는 extern을 .c 파일에 넣되 헤더에만 넣으면 안됩니다. 이것이 선언과 정의의 차이입니다.

Extern은이 변수를 알려주지 만 예약 할 메모리가 없음을 의미합니다. 컴파일러는 이제 다음과 같이 말합니다 : Ok,이 변수를 사용하기를 원하지만, 실제로 정의되지는 않았지만, 거기에있을 것이라고 약속했습니다.

어쨌든이 변수를 정의 할 수있는 다른 개체 (다른 .c 파일)는 컴파일러에서 알 수 없습니다. 따라서 실제로 모든 변수를 모으려고 링커에 유지합니다.

링커가 다른 곳에서 해당 변수를 찾지 못하면 암시 적으로 변수 local을 생성하지만 깨진 C 표준에 대해 경고합니다.

+4

왜 '메인'이 헤더에 있다고 생각합니까? – HolyBlackCat

+0

'extern'을 사용하기 때문에. 어쨌든 당신이 옳다면,'extern' 선언과 함께 .c 파일에있을 수도 있습니다. – Psi