2016-08-03 9 views
-2

로깅 시스템 작성하기 및 배열을 모듈에 저장하고 수정하고 싶습니다 (적절한 이름의 헤더 파일 foo.h와 함께 foo.c라고 부름). main.c의 내용에 액세스 할 수 있습니다. foo.c를에서 내가 가진 :가C에서 다른 모듈의 extern 배열 선언하기

unsigned char log[4096] = {0}; 

main.c를 하면서 다음과 같이 오류 산출

#include "foo.h" 
int main(){ 
    extern unsigned char log[4096]; 

    // code 

    return 0 
} 

:

error: 'log' redeclared as different kind of symbol

나는이 권리를하고 있는가 ? 나는 extern log를 "log []"와 "log"로 선언하려했으나 아무런 쓸모가 없었다. 이 문제에 대한 약간의 깨달음이 도움이 될 것입니다. 고맙습니다!

+0

변수가 정의 된 파일과 헤더를 사용하는 파일 (헤더의 경우'foo.h', 헤더의 경우 foo.h, 헤더의 경우 foo.c)에 사용되는 헤더에 선언이 있어야합니다. 이것이 정의 된 곳은'main.c '이다). 이것은 당신에게 필요한 교차 검사를 제공합니다. 일반적인 C 소스 파일에'extern '을 써서는 안됩니다. 헤더에만 표시되어야합니다. 'extern '을 써야한다고 생각하는 곳이라면, 사용하고있는 헤더를 사용하고 있지 않거나 헤더가 불완전하다는 것을 의미합니다. 둘 다 장기 유지 관리 문제를 야기합니다. –

+0

헤더에 변수를 선언하지 않겠습니다. 모든 c 파일에는 컴파일러가 해당 변수를 할당 할 헤더가 포함됩니다. 개발자가 헤더에서 전역 변수를 선언하고 헤더가 두 개의 다른 C 파일에서 사용 되었기 때문에 oldwr 프로젝트에서 매우 불쾌한 버그가있었습니다. – Sitram

답변

2

문제는 the log function에서 <math.h>입니다. 가장 간단한 해결책은 배열의 이름을 바꾸는 것입니다.

+0

그것이 바로 그것이 함수라고 계속해서 말한 이유입니다 ... 감사합니다. 그런 간단한 해결책을 찾아라. – Justin

+1

이전에 이름 충돌에 물린 유일한 사람은 아니 었습니다. 오류 메시지 "*가 실제로 말하는 것을 의미합니다 ... *"를 배우는 것은 확실한 방법입니다. –

0

log가 전역 변수이므로 extern 선언을 main 외부로 이동해보십시오.

extern 키워드는 기본적으로 심볼이 다른 모듈에서 선언 되었기 때문에 오류가 발생하지 않도록 컴파일러에 지시합니다. 링크시 기호가 발견되지 않으면 오류가 발생합니다.