2012-04-13 3 views
9

gcc 소스 파일을 탐색했습니다. gcc.c, 나는 지금 내 의심의 여지가 extern은 특정 기능이 파일이 아니라 프로젝트에 다른 곳에서 찾을 수 컴파일러에게하는 것입니다 extern 선언과 함수 정의가 모두 같은 파일에 있습니다

extern int main (int, char **); 

int 
main (int argc, char **argv) 
{ 

같은 것을 발견했다. 그러나 여기서 main의 정의는 extern 선언 바로 뒤에 있습니다. 그렇다면 extern 선언의 목적은 무엇입니까?

우리가 모듈

모든 아이디어를 외부에서 특정 심볼을 내보내 wherin이 특정 예에서, extern, 우리는 어셈블리에서 사용하는 export처럼 행동하는 것처럼 보인다?

답변

13

당신은 extern을 오해하고 있습니다 - 그것은 하지이 정의가 다른 파일에있는 컴파일러에게하지, 단순히 그것을 정의하지 않고 존재 함을 선언합니다. 동일한 파일에 정의 된 것은 완벽합니다.

C에는 선언 (정의하지 않고 존재하는 것으로 선언 됨)과 정의 (실제로 존재하게 함) 개념이 있습니다. 을 원하는대로 자주 선언 할 수 있지만 한 번만 정의 할 수 있습니다.

함수에는 기본적으로 외부 연결이 있으므로이 경우 extern 키워드는 관련이 없습니다.

0

경고에 따라 함수 프로토 타입이 누락되었습니다. 그게 다야.

6

함수는 암시 적으로 C에서 extern입니다. extern은 시각적 인 알림입니다. 참고로, extern이 아닌 함수를 만들려면 static 키워드를 사용할 수 있습니다.

+0

예. 비정상적인 일을 할 때는 extern을 사용하십시오. – Barry

0

main 함수의 정의 :

int main(int argc, char **argv) { ... } 

는 선언이 외부 링크 기능 main의 프로토 타입을 구문은 이미. 이는 main 정의가 중복되기 직전에 extern이라는 프로토 타이핑 된 선언을 의미합니다.

2

함수 선언에서 extern은 함수에 외부 연결이 있다는 것을 단순히 선언합니다. 이 문맥에서 extern 키워드는 전혀 쓸모가 없으며 그 효과는 extern 키워드가없는 일반 선언/프로토 타입과 동일합니다.