2016-08-18 9 views
-2
내가 문제가 함께 나는 다음이하고자하는 몇 가지 코드를 넣어 데

에서 정적 구조체 멤버의 주소를 취득 : 다른 헤더 파일

  • 내가 유형을 만들 수있는 헤더 파일 myHeader.h 되세요을 struct myStruct 회원은 int number1, int number2int number3입니다. 이 파일에는 struct 인스턴스에있는 각 구성원의 주소를 가져 오는 "getter"프로토 타입이 포함됩니다.

  • I는 struct myStruct정적 인스턴스를 선언하는 변환 부 (file.c), 즉 static struct myStruct myStructInstance. 이 번역 단위는 "getter"함수를 정의합니다 (게시물 끝에 코드 예제를 사용하여 설명합니다).

  • 또 다른 헤더 파일 anotherHeader.h - 이제는 이것이 나에게 문제가되는 까다로운 비트입니다 - 정적 구조의 멤버 각각의 주소를 얻어 무언가에 사용하십시오.

다음은 내가 말하는 것에 대한 예입니다.

myHeader.h

struct myStruct{ 
    int number1; 
    int number2; 
    int number3; 
}; 

int* get_number1(void); 
int* get_number2(void); 
int* get_number3(void); 

file.c는

#include <myHeader.h> 

static struct myStruct myStructInstance = { 
     .number1 = 0, 
     .number2 = 0, 
     .number3 = 0 
}; 

int* get_number1(void){ 
    struct myStruct* ptr_myStructInstance = &(myStructInstance); 
    int* number1Address = &(ptr_myStructInstance->number1); 
    return number1Address; 
} 

int* get_number2(void){ 
    struct myStruct* ptr_myStructInstance = &(myStructInstance); 
    int* number2Address = &(ptr_pfcVariables->number2); 
    return number2Address; 
} 

int* get_number3(void){ 
    struct myStruct* ptr_myStructInstance = &(myStructInstance); 
    int* number3Address = &(ptr_myStructInstance->number3); 
    return number3Address; 
} 

anotherHeader.h

#include <myHeader.h> 

int* pNumber1 = get_number1(); 

int* pNumber2 = get_number2(); 

int* pNumber3 = get_number3(); 

문제는 그 회 위의 e 코드는 anotherHeader.h에 "initializer 요소가 상수가 아닙니다."오류를 발생시킵니다. 정적 저장 기간을 사용하여 변수를 초기화 할 때 왜 상수가 아닌 표현식을 사용할 수 없는지에 대한 몇 가지 대답을 읽었지만 이것이 내 코드와 어떤 관련이 있는지 이해하지 못합니다.

+2

'return & myStructInstance.number1'? –

+0

'anotherHeader.h'에 관해서, 왜 헤더의 변수를 정의합니까? 즉, 헤더 파일을 여러 소스 파일에 포함 할 수 없습니다. –

+0

@ JoachimPileborg 특별한 이유가 없습니다 - 사실, 그것이 내가 원래 가지고 있었던 것입니다. 어느 쪽이든 작동하지 않았으며 지금 당장 코드가 붙여져 있습니다. – agromov

답변

1

나는 그러나 나는이 내 코드에 어떤 관련이 있는지 이해가 안 정적 저장 기간과 변수를 초기화 할 때 우리가 일정하지 않은 표현을 사용할 수없는 이유에 대한 몇 가지 답변을 읽었습니다.

함수 호출은 상수가 아닌 표현식입니다.

int* pNumber1 = get_number1(); 

위의 코드는 전역 변수를 상수가 아닌 식으로 초기화하려고합니다.

+0

그래서이 규칙은 정적 변수뿐만 아니라 전역 변수에도 적용됩니까? – agromov

+0

전역 변수에는 정적 저장 기간이 있습니다. – jxh

+0

@jxh :'static'은 _static storage duration_과 다릅니다. – Olaf

0

단순히 전역 범위에서 코드를 호출 할 수 없습니다.

그러나, 당신은 쉽게 단순히 함께 myHeader.h을 연장하는 것을 시도 될 당신이 나타납니다 같은 일을 수행 할 수 있습니다 : 다음

extern int *pNumber1, *pNumber2, *pNumber3; 

및 할당하고 파일이 초기화.c with :

int *pNumber1 = &myStructInstance.number1, 
    *pNumber2 = &myStructInstance.number2, 
    *pNumber3 = &myStructInstance.number3; 
+1

더 자세한 정보가 없으면이 모든 것이 나쁜 아이디어처럼 보일 수도 있고 XY 문제 일 수도 있습니다. – Olaf

+0

필자는 'extern'을 사용하여 변수를 공유하지 않으려 고했기 때문에 코드에서 (아마도 불필요한) 복잡성을 피할 수있었습니다. – agromov