1

我不知名的前任留下了密码。我尝试使用其中的一些,但他的代码看起来很不寻常。

1.他所做的不是在头文件而是在c文件中定义变量:variables.c

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;   .... 

2 init_vars() 在另一个 c 文件中初始化上述变量:init_vars.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.在main.c中调用init_vars()

我第一次尝试在 init_vars.c 中直接包含“variables.c”,但它给了我以下错误:

#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 中定义的每个变量都出现错误。

将 variables.c 更改为 variables.h 仍然会给我同样的错误。

如何处理变量定义的 c 文件而不是头文件?

谢谢

4

1 回答 1

1

因为variables.c没有声明变量或预处理器宏,而是实际定义了这些变量,所以您需要extern在“包含”阶段制作它们,并将它们定义在单个文件中(例如,externs_definitions.c)。

例如:

变量.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.c不直接包含variables.c并且没有将它们声明为的头文件extern,那么现有代码如何不会使预处理器尝试访问未声明的变量失败?

于 2013-10-16T16:54:56.967 回答