2010-07-27 6 views
2

: 은 헤더 파일과 같은 경우 :선언과 C의 기간에서 선언 및 정의와 혼동 아직 정의

#ifndef _BASIC_H_ 
#define _BASIC_H_ 

void test(); 
extern int i; //define or declare 
#endif 

두 소스 파일 f1.c 및 f2.c이 헤더를 포함하고 하나 개의 소스 파일은 변수 "i"를 정의해야합니다.

하지만 헤더 파일이 같은 경우

:

#ifndef _BASIC_H_ 
#define _BASIC_H_ 

void test(); 
int i; //define or declare 
#endif 

및 두 개의 소스 파일 f1.c 및 f2.c, 정의없이이 헤더를 포함는 "i"가 모든 파일에 여전히 통해 때 변수 간다 변수를 사용합니다.
내 질문은 변수가 정의 된 때입니다. 스토리지를위한 메모리를 할당하고 어쩌면에 값을 할당 할 때 변수를 정의

덕분에

+0

[이것은 C++과 동일한 질문에 대한 답변입니다.] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632) C와 C++에는 차이점이 있지만, 당신이 묻는 것에 대해서는 적용되지 않습니다. – sbi

+0

'void test();'는'void test (void);'와 같지 않습니다. 두 번째 것은 컴파일 타임에'test (foo);를 호출 할 때 에러를 잡을 것이다. – nmichaels

답변

8

입니다. 선언은 특정 이름과 유형의 변수가 있지만 메모리가 이미 할당되어 있다고 선언하는 것입니다.

extern 키워드를 사용하면 변수를 선언하고 있지만 정의하지는 못합니다.

귀하의 구체적인 질문에 대한 첫 번째 예는 선언하고 두 번째 대답은 정의하는 것입니다.

+0

+1 간결한 답변 – ChrisBD

+0

나는이 문제에 대해 C 프로그래밍 언어의 자료를 요약했다. 그래도 고마워. –

+2

'int i;''는 변수의 정의를 제공합니다. C 표준을 엄격히 읽으면 두 개 이상의 파일에 해당 헤더가 포함되어있는 경우 'i'에 대해 여러 정의가 생기며 컴파일 링의 링크 단계가 실패합니다. ** 여러 개의 외부 정의 ** 개체의 식별자에 대해 둘 이상의 외부 정의가있을 수 있으며 키워드를 명시 적으로 사용하지 않고 을 사용할 수 있습니다 (부록 X (§J.5.11)). 'extern'; 정의가 일치하지 않거나 개가 초기화되면 동작은 정의되지 않습니다 (6.9.2). –

0

자동 및 레지스터 변수의 경우 정의와 선언간에 차이가 없습니다. 자동 또는 레지스터 변수를 선언하는 프로세스는 변수 이름을 정의하고 적절한 메모리를 할당합니다.

그러나 외부 변수의 경우 : 변수에 대한 액세스가 항상 동일한 셀을 참조하도록 변수의 메모리를 한 번만 할당해야하기 때문에. 모든 변수는 한 번만 정의해야합니다.

외부 변수가 정의 된 파일과 다른 파일에서 사용되는 경우 할당 된 고유하게 정의 된 외부 변수 셀과 이러한 사용을 "연결"하는 메커니즘이 필요합니다. 같은 외부 변수의 참조를 다른 파일에 연결하는이 과정을 참조 해결이라고합니다.

저장소 클래스 지정자가없는 모든 함수 외부의 선언문을 사용하여 정의되고 선언 될 수 있습니다. 이러한 선언은 변수에 메모리를 할당합니다. 선언 문은 선언의 시작 부분에 extern 저장 클래스 지정자를 사용하여 변수 이름을 간단히 선언하는 데 사용될 수도 있습니다. 이러한 선언은 변수가 다른 곳에서 정의됨을 지정합니다. 즉,이 변수의 메모리는 다른 파일에 할당됩니다. 따라서 extern 키워드로 선언 된 경우 외부 변수에 정의 된 변수 외의 변수에 액세스 할 수 있습니다. 새로운 메모리는 할당되지 않습니다. 이러한 선언은 변수가 다른 곳에서 정의되고 컴파일되지 않은 외부 변수로 코드가 컴파일됨을 컴파일러에 알립니다. 외부 변수에 대한 참조는 연결 프로세스 중에 해결됩니다.

Ex. 
Code: 

    //file1.c 
    extern char stack[10];  
    extern int stkptr; 
    .... 

    //file2.c  
    char stack[10];  
    int stkptr; 
    .... 

이러한 선언은 변수 stack [] 및 stkptr이 다른 파일에 정의되어 있음을 컴파일러에 알립니다. 키워드 extern이 생략되면 변수는 새로운 변수로 간주되어 메모리가 할당됩니다. 다른 파일에 정의 된 동일한 외부 변수에 대한 액세스는 키워드 extern이 선언에 사용 된 경우에만 가능합니다.

+3

[멋진 잘라 붙이기 작업] (http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.4.html) –

+1

그가 준 4 개의 답변 중 3 개는 귀속이 없음 잘라 내기 및 붙여 넣기 작업. 나는 그를 구석에 넣었다. – Will