初始化:静态符号'myStruct'的地址用于符号'otherStruct'

时间:2013-10-08 10:53:49

标签: c static warnings

以下代码向我发出警告:

  
    

初始化:静态符号的地址' myStruct'用于符号' otherStruct'

  

警告在SomeOtherStruct otherStruct初始化的右括号/分号处给出。

typedef struct
{
    U32BIT memberA;
    U32BIT memberB;
} MyStruct;

typedef struct
{
    U32BIT *memberAPtr;
    U32BIT *memberBPtr;
} SomeOtherStruct;

static MyStruct myStruct;

int main(void)
{
    SomeOtherStruct otherStruct =
    {
        &myStruct.memberA,
        &myStruct.memberB
    }; // <<-- warning given here.

    // doing something with otherStruct
}

如果我SomeOtherStruct otherStruct static,问题就会消失。但我不想这样做,因为我不希望SomeOtherStruct otherStruct总是在内存中,因为它被传递到另一个存储它的函数/文件。

(SomeOtherStruct来自一个库,需要使用指针列表对其进行初始化。)

为什么我的编译器会给我这个警告,我该怎么办?或者我做错了什么?因为我没有看到这个代码有任何问题(QAC / MISRA-C也没有,因为通常QAC / MISRA-C正在抱怨)。

另外,可能一文不值,我的编译器是FUJITSU Softune Fs907s

2 个答案:

答案 0 :(得分:3)

如果您进行网络搜索:

  

“初始化:静态符号的地址”“用于符号”

你会发现:

http://www.fujitsu.com/downloads/MICRO/fma/pdfmcu/softccmp-cm25-00202-2e.pdf

这显然是你说你正在使用的相同编译器的手册。相关段落说:

W1020C %Z: address of static symbol `%D' is used for symbol `%D'
  

静态变量的地址用作初始值   值。可以从中更改静态变量的值   编译单元的外部。继续编译制作   初始化有效。

这就是你在这里得到的:legal C,但是你的编译器警告你。为什么感觉这个特别的东西值得警告,我不确定,但希望从这里你可以弄清楚如何避免警告或禁用它。

答案 1 :(得分:0)

此警告是为了避免暴露内部链接。全局变量上的单词static将使内部链接变为变量,这意味着编译单元内部。