2017-11-13 14 views
0

私はcの構造とヘッダーファイルの宣言について質問があります。 私は3つの変数に別の2つの変数がリンクされているコードを書いています。私は構造を宣言することに決めました。私は擬似コードを書いているの下にヘッダーファイルのグローバル構造

//----------registers.h--------- 
#ifndef __REG__H__ 
#define __REG__H__ 

struct ADE_reg_type 
{ 
    unsigned int i : 4; 
    unsigned int j : 4; 
}; 

extern struct ADE_reg_type AIRMS_reg; 
extern struct ADE_reg_type BIRMS_reg; 
extern struct ADE_reg_type CIRMS_reg; 
#endif 


//-----------registers.c------------------- 
#include "registers.h" 

struct ADE_reg_type AIRMS_reg = {.i = 4,.j = 5}; //initializing 
struct ADE_reg_type BIRMS_reg = {.i = 3,.j = 4}; //initializing 
struct ADE_reg_type CIRMS_reg = {.i = 1,.j = 9}; //initializing 

//-----------main.c------------------- 
#include "registers.h" 

int main() 
{ 
    display_numbers(AIRMS_reg); //display_numbers(struct ADE_reg_type) has 
           //defined in another .c file which also includes 
           // registers.h 
} 

私は何がしたいんだと、私はすべての.cファイルにアクセスできる変数を持つべきであるということです。変数の範囲はグローバルでなければなりません。それはグローバルな構造を使用する正しい方法ですか、私はここでいくつかの間違いをしていますか?

+1

グローバル*を使うのは悪い考えですが、実際にグローバルが必要な状況であれば、これはどうやってやるのですか。ここで唯一奇妙なのは、 'display_numbers()'の呼び出しです。この関数があなたのグローバルの値を表示する場合、パラメータは必要ありません。おそらくパラメータとしての* * structタグ*は間違っているでしょう。 –

+1

ああ、二重アンダースコア( '__')を使用してインクルードガードを開始しないでください。これは実装に予約されています。 'REG_H'か多分' REG_H_'を使うだけです。 –

+1

@FelixPalmen表示されているコードはあなたの(そうでなければ適用可能な)コメントから変更されていますか?少なくとも私はstructタグをパラメータとして見ることはできません。 – Yunnosch

答えて

0

(コースの種類ごとに)どこかに1つのグローバル変数を定義し、残りはすべてエクステンションになります。 構造はヘッダーファイル内にある必要がありますが、ヘッダーファイル内の変数を初期化または定義することはありません。

//----------registers.h--------- 
#ifndef __REG__H__ 
#define __REG__H__ 

struct ADE_reg_type 
{ 
    unsigned int i : 4; 
    unsigned int j : 4; 
}; 


#endif 


//-----------registers.c------------------- 
#include "registers.h" 

struct ADE_reg_type AIRMS_reg = {.i = 4,.j = 5}; //initializing 
struct ADE_reg_type BIRMS_reg = {.i = 3,.j = 4}; //initializing 
struct ADE_reg_type CIRMS_reg = {.i = 1,.j = 9}; //initializing 

//-----------main.c------------------- 
#include "registers.h" 

extern struct ADE_reg_type AIRMS_reg; 

extern struct ADE_reg_type BIRMS_reg; 

extern struct ADE_reg_type CIRMS_reg; 

int main() 
{ 
    display_numbers(AIRMS_reg);        
} 
+0

AIRMS_reg変数をregisters.cのextern型として宣言できますか?AIRMS_regを使用するすべての.cファイルでこれを行う必要がありますか? –

+0

例を見てみましょう:多くのcファイルでAIRMS_reg変数を使用したい場合は、gloabl(AIRMS_reg変数)とextern(AIRMS_reg変数)という他のすべてのファイルに通常どおり宣言する必要があります。別のより良い方法は、この元の変数へのポインタを返すgetFunc()を作成することです。コードはきれいになり、読みやすくなります。 –

+0

コード例を追加しました。理解しているかどうか教えてください。 –

0

アレイアプローチ:例えば

例えば:

ADE_reg_type RegType_Array[3]; 
ADE_reg_type* ADE_reg_type(char index) 
{ 
    return &RegType_Array[index]; 
} 

変数のアプローチ:あなたは@Elad Hazanを言っているこのような

ADE_reg_type AIRMS_reg = {.i = 4,.j = 5}; 
ADE_reg_type* AIRMS_reg() 
{ 
    return &AIRMS_reg 
} 
1
//----------registers.h--------- 
#ifndef __REG__H__ 
#define __REG__H__ 

struct ADE_reg_type 
{ 
    unsigned int i : 4; 
    unsigned int j : 4; 
}; 


#endif 


//-----------registers.c------------------- 
#include "registers.h" 

const struct ADE_reg_type AIRMS_reg = {.i = 4,.j = 5}; //initializing 
const struct ADE_reg_type BIRMS_reg = {.i = 3,.j = 4}; //initializing 
const struct ADE_reg_type CIRMS_reg = {.i = 1,.j = 9}; //initializing 

//-----------main.c------------------- 
#include "registers.h" 

extern const struct ADE_reg_type AIRMS_reg; 

extern const struct ADE_reg_type BIRMS_reg; 

extern const struct ADE_reg_type CIRMS_reg; 

int main() 
{ 
    display_numbers(AIRMS_reg);        
} 

//-----------------file_1.c-------------------- 
#include "registers.h" 

extern const struct ADE_reg_type AIRMS_reg; 

extern const struct ADE_reg_type BIRMS_reg; 

extern const struct ADE_reg_type CIRMS_reg; 

//-----------------file_2.c-------------------- 
#include "registers.h" 

extern const struct ADE_reg_type AIRMS_reg; 

extern const struct ADE_reg_type BIRMS_reg; 

extern const struct ADE_reg_type CIRMS_reg; 

+0

アレイアプローチを試してみてください - 私はそれがもっと良いと思います... –

関連する問題