2013-10-16 2 views
1

코드를 남긴 알 수없는 전임자. 나는 그 중 일부를 사용하려고 시도하지만 그의 코드는 특이한 것처럼 보입니다. variables.cc 파일에 정의 된 변수 처리시 헤더 파일이 아님

CHGR_CMD comand[MAX_COMANDS] __attribute__ ((section ("external"))); 
RAWDAT rawdat[MAX_RAWDAT] __attribute__ ((section ("external")));  
SC_TEST *curr_test[NUMCHANS]; /* array of pointers to current testrec */ 
SC_TESTSETUP chparam[NUMCHANS] __attribute__ ((section ("external"))); 
SC_HOLDSTAT stats[NUMCHANS] __attribute__ ((section ("external"))); 
RAWDAT *bufs[NUMCHANS]; 
//FACTS control[NUMCHANS]; 

short ntest;  
short new_dbuff;  
short start_err;  
short update_status; 
long status_sent; 
short load_done;  
char h_lok; .... 
다른 C 파일에

2 init_vars() 초기화 변수 위 :

init_vars.c 그가 한 1.What

하지 헤더하지만 C 파일에 변수를 정의하다 main.c에있는

memset((char *) rawdat,0 ,sizeof(rawdat)); 
memset((char *) curr_test,0 ,sizeof(curr_test)); 
memset((char *) chparam,0 ,sizeof(chparam)); 
memset((char *) stats,0 ,sizeof(stats)); 
memset((char *) bufs,0 ,sizeof(bufs)); 

memset((char *) comand,0 ,sizeof(comand)); 
ntest = 0; 
new_dbuff = 0; 

start_err = 0; 

3.call init_vars()

I 안으로 시도한 처음

#10056 symbol "ad_lok" redefined: first defined in "./variables.obj"; redefined in "./init_vars.obj" sCharger_Test_v1   C/C++ Problem 

ad_lok 변수뿐만 아니라뿐만 아니라 variables.c에 정의 된 모든 변수는 오류 충돌 : clude "variables.c"직접 init_vars.c에, 그러나 그것은 오류 아래 내게 준.

variables.c를 variables.h로 변경하면 여전히 동일한 오류가 발생합니다.

헤더 파일이 아닌 변수를 어떻게 처리 할 수 ​​있습니까?

덕분에 변수 나 전 처리기 매크로를 선언하지만, 실제로 당신이 그들에게 "포함"단계에서 extern을해야하고, 하나의 파일에 정의됩니다,이 변수를 정의하지 않습니다 variables.c 때문에

+0

정확히 한 번 포함시켜야합니다. 일반적으로'# ifdef' 유형의 구문을 사용하고 그 안에 변수를 정의하십시오. 이렇게하면 파일이 두 번째 포함될 때 건너 뜁니다. 모든 헤더 파일에서 이것을 볼 수 있습니다 - 예를 들어'stdio.h '를 열면됩니다. 그래도 끔찍한 코딩처럼 보입니다. – Floris

+1

.c 파일에 변수를 정의해야합니다. .h 파일로 만 * 선언해야합니다. 'init_vars.c' +는 (변경 전에) 반드시이 변수의 선언을 봐야합니다. 그렇지 않으면 컴파일되지 않습니다. 따라서 왜 이러한 변수가 정확한지 알아 내야 만합니다. 이러한 이해가 없으면 변경 사항은 일을 깨뜨릴 수밖에 없습니다. –

답변

1

(예를 들어 , externs_definitions.c). 예를 들어

: 그대로

variables.h

#ifndef VARIABLES_H 
#define VARIABLES_H 
extern CHGR_CMD comand[MAX_COMANDS] __attribute__ ((section ("external"))); 
extern RAWDAT rawdat[MAX_RAWDAT] __attribute__ ((section ("external")));  
extern SC_TEST *curr_test[NUMCHANS]; /* array of pointers to current testrec */ 
... 
#endif /* VARIABLES_H_ */ 

그런 variables.c을 둡니다.

그런 생각 init_vars.c

#include "variables.h" 

또한 질문에; 현재 코드는 어떻게 작동합니까? init_vars.cvariables.c이 직접 포함되어 있지 않고 extern으로 선언 된 헤더 파일이없는 경우 기존 코드가 선언되지 않은 변수에 액세스하려는 전 처리기를 실패하지 않는 이유는 무엇입니까?

+0

답변 해 주셔서 감사합니다. 솔직히 말해서 왼쪽 코드가 작동하지 않습니다. 나는 두 사람을 통해 프로젝트를 인수했다. 내가 프로젝트를 인수하면서 그들은 이미 문서와 코멘트를 남기지 않고 사라져 버렸습니다. – Jin

+0

variables.h에있는 모든 변수를 extern에 추가하고 variables.c를 그대로두면 컴파일이 실패하지 않습니다.나는 이전의 사람이 다른 c 파일에 사용 된 모든 변수를 하나의 파일에 넣으려고했다고 생각한다. 이것은 variables.c이다. – Jin

관련 문제