从另一个头文件中获取静态struct成员的地址

时间:2016-08-18 23:17:10

标签: c struct

我无法整理一些我希望拥有以下内容的代码:

  • 有一个标题文件myHeader.h,我在其中创建了一个struct myStruct类,其成员为int number1int number2int number3。该文件还包含一个" getter"用于获取struct实例中每个成员的地址的原型。

  • 翻译单元(file.c),其中我声明了struct myStruct静态实例,即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();

问题是上面显示的代码抛出&#34;初始化元素不是常数&#34; anotherHeader.h中的错误。我已经读了一些答案,说明为什么在使用静态存储持续时间初始化变量时我们不能使用非常量表达式,但是我不明白这与我的代码有什么关系。

2 个答案:

答案 0 :(得分:1)

  

我已经读了几个答案,说明为什么在使用静态存储持续时间初始化变量时我们不能使用非常量表达式,但是我不明白这与我的代码有什么关系。

函数调用是一个非常量表达式。

int* pNumber1 = get_number1();

上面的代码试图用非常量表达式初始化一个全局变量。

答案 1 :(得分:0)

您根本无法在全局范围内调用代码。

但是,只需将 myHeader.h 扩展为:

,您就可以轻松完成与您尝试做的事情相同的事情。
extern int *pNumber1, *pNumber2, *pNumber3;

然后使用

file.c 中分配和初始化这些内容
int *pNumber1 =  &myStructInstance.number1,
    *pNumber2 =  &myStructInstance.number2,
    *pNumber3 =  &myStructInstance.number3;