2017-04-19 4 views
0

에 배열을 만들기위한 '통근'나는 배열을 만드는 extern를 사용하지만 C 소스 파일사용하여 C

// test.c 
void test_task(void) { 
    callback[1].count = 1; 
    callback[1].total = 2; 
} 

동안 지금 나에게 오류

"undefined reference to `callback_Task'"

// test.h 
typedef struct { 
    uint32_t count; 
    uint32_t total; 
} callback_task; 

extern volatile callback_task callback[10]; 

을주고 보인다습니다 컴파일 중 오류가 발생했습니다 :

+0

'test.c' 파일에'test.h'를 포함 시켰습니까? – haccks

+1

'extern' 키워드는 * 선언으로 만듭니다 *. 어딘가에 * 정의 *가 필요합니다. –

+0

또한 왜 휘발성을 사용하고 있습니까? –

답변

1

extern 선언은 배열을 어디에도 만들지 않습니다. 이것은 어딘가에서 변수를 찾기위한 컴파일러/링커의 지시 일뿐입니다.

을 정의해야합니다. extern이 없으면 일부 번역 단위에서 프로그램을 연결하게됩니다.

좋은 후보가 다음과 같이 test.c이 될 것 같다 :

volatile callback_task callback[10]; 

void test_task(void) { 
    callback[1].count = 1; 
    callback[1].total = 2; 
} 
+0

예. extern을 제거하면 작동합니다 ...하지만 단지 질문입니다. 클래스 외부에서 사용하려면 extern ...을 만들 필요가 있습니다. 맞습니까? –

+0

@JigneshPanchal - h 파일에서 'extern'을 제거하지 않았다. 나는 c 파일에 완전히 독립적 인 라인을 추가한다고 말했다. – StoryTeller

+1

@JigneshPanchal C에서 클래스와 같은 것이 없습니다. – Gerhardh

0

TL을, DR을 그것은 컴파일러 아니다, 그것은 callback 변수 M.I.A.가 그의 모델들이었습니다 불평 링커입니다 지위.


extern volatile callback_task callback[10]; 

처럼 문을 정교하게하기 위해 "어딘가에 존재"유형 callback_task [10]의 변수 callback 컴파일러를 알려줍니다. 그것은 "선언"입니다. 변수 자체에 "정의"하지 않습니다. 그래서, 그 존재는 "증명 된"것이 아니라 "알려진"것입니다.

나중에 링커에서 "실제"변수를 검색하는 동안 링커에서 변수를 검색하지 않으므로 오류가 발생합니다.