2017-09-20 16 views
3

일부 소스 코드를 분석하는 동안 하나의 파일 (.c)에 다른 파일이 아닌 이라는 정의가 있습니다. (이는 flex에서 생성 된 파일의 코드 중 하나이며 포함 된 파일이 없습니다 (stdio.h, yyin를 정의 string.h, errno.h, stdlib.h, inttypes.h)) :변수의 선언과 extern 선언이 같은 파일에 존재할 때의 의미는 무엇입니까?

extern FILE *yyin, *yyout; 

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 

내가 기본적으로이 말씀이 무슨 뜻인지 알고있다.

그러나 extern 키워드는 변수와 같은 정의를 사용하고 다른 파일에있는 함수를 사용합니다. (그것은 그것을 위해 메모리를 할당하지 않습니다.)

그래서, 내가 무엇을 의미하는 것은 코드가 :

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 

이 아닌 동일한 파일에 다른 파일에 표시한다. 예를 들어

,

a.c 

extern File *yyin; /* It means that a.c want to use yyin declared in b.c */ 

int main(void) { 
    yyin = *expressions*; /* yyin is variable in b.c */ 

    return 0; 
} 

b.c 

File *yyin = (FILE*) 0; 

왜 그들은 같은 파일에 존재합니까? 같은 이름을 사용하는 extern 키워드와 일반 변수 선언이 같은 파일에있을 때 특별한 의미가 있습니까?

+0

만약'# include'가 어떻게 작동하는지 생각해 보면 정의가있는 번역 단위가 extern 선언을 가지고있는 것이 정상적인 것임을 알게 될 것입니다. –

답변

2

첫 번째 선언은 기본값에 의존하지 않고 extern을 명시 적으로 지정한다는 점에서 일반적이지 않습니다. 변수는 파일 범위에서 선언되기 때문에, 그들은 기본적으로 외부 링크를 가지고, 귀하의 경우 즉, 선언은 각 변수가 범위, 저장 기간을 갖도록 *

FILE *yyin, *yyout; 

에 리콜과 동일
, 및 연결. 키워드 extern은 변수에 외부 연결이 있음을 지정합니다. 링키지에 대한 다른 옵션은 static이며 링크가 없습니다.

변수는 여러 개의 선언을 가질 수 있습니다. 여러 선언이 서로 충돌하지 않는 한 C 컴파일러는이를 결합 할 수 있습니다.

사례 변수 yyinyyout에는 변수에 외부 연결이 있고, 두 변수를 모두 NULL으로 초기화하는 정의가있는 선언이 있습니다.

* 다른 이유는 yyinyyout이라는 다른 선언이 없기 때문입니다. 일반적으로 extern이없는 선언은 동일한 번역 단위에서 다른 정의가 제공되지 않는 경우 정의가 될 수 있습니다. 이를 임시 정의이라고합니다. extern이라는 선언은 임시 정의가되지 않습니다.

+0

제 경우에는 전역 변수가 기본적으로 외부 연결을 가지고 있지만, 여기서 extern 키워드는 명시 적으로 외부 링크가 있음을 명시 적으로 의미합니다. 맞습니까? – user7159879

+0

@ user7159879 오른쪽. 이것은 일반적인 전역 변수를 선언하는 특별한 방법입니다. – dasblinkenlight

+1

'extern'의 유무와 정확히 일치하지는 않습니다.'extern'이 없으면 'extern'을 사용할 수없는 임시 정의 *가 될 수 있습니다. –