2013-10-16 44 views
1

我未知的前任誰已經離開代碼。我嘗試使用其中的一些,但他的代碼看起來很不尋常。處理c文件中定義的變量而非頭文件

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.call init_vars()中的main.c

我第一次在試圖CLUDE「variables.c」直接在init_vars.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文件而不是頭文件?

感謝

+0

您必須確保您只包含一次 - 通常使用'#ifdef'類型的構造來完成此操作,並在其中定義一個變量。這樣當文件第二次被包含時,它將被跳過。你可以在所有的頭文件中看到這個 - 例如,打開'stdio.h'。看起來像可怕的編碼雖然。 – Floris

+1

您應該*總是*在.c文件中定義變量。你應該只在* .h文件中聲明它們。 'init_vars.c' +必須*(你的任何修改之前)看到這些變量的聲明,否則它不會編譯。因此你需要找出並理解它爲什麼看到這些變量。沒有這種理解,你的改變必然會破壞事物。 –

回答

1

因爲variables.c不聲明變量或預處理宏,但實際上定義這些變量,你就需要讓他們在「包括」階段extern,並在單個文件中定義他們(說,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.c沒有直接包含variables.c,並且沒有頭文件將其聲明爲extern,那麼現有代碼如何不會使預處理器嘗試訪問未聲明的變量失敗?

+0

謝謝你的回答。說實話,左邊的代碼不起作用。我通過幾個人之後接手了項目。當我接手這個項目時,他們已經離開了文檔和評論。 – Jin

+0

向variables.h中的每個變量添加extern並保留variables.c不會導致編譯失敗。我想,以前的人打算把其他c文件中使用的所有變量放在一個文件中,即variables.c – Jin