2017-11-13 1 views
0

C의 구조 및 헤더 파일에 대한 선언과 관련하여 질문이 있습니다. 다른 변수가 연결된 3 개의 변수가있는 코드를 작성하고 있습니다. 그래서 나는 구조를 선언하기로 결정했습니다. 내가 의사 코드를 쓰고 있어요 아래헤더 파일의 전체 구조

//----------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 표시된 코드가 (그렇지 않으면 적용 가능한) 주석 이후 변경되었습니다. 그렇지 않습니까? 적어도 매개 변수로 구조 태그를 볼 수 없습니다 (더 이상). – Yunnosch

답변

0

어딘가에 하나의 전역 변수를 정의하면 나머지는 모두 외부 변수가됩니다. 구조체가 헤더 파일에 있어야하지만 헤더 파일에 변수를 초기화하거나 정의하지 마십시오. 나쁜 습관입니다. .

//----------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 변수를 사용하려면 globabl (AIRMS_reg variable;) 및 extern (AIRMS_reg variable;)과 같은 다른 모든 파일에서 정상적으로 선언해야합니다. 또 다른 좋은 방법은이 원래 변수에 대한 포인터를 반환하는 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

어레이 접근 방식을 시도해보십시오. 훨씬 좋을 것 같아요. –