3

以下代码给了我警告:

初始化:静态符号“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

4

2 回答 2

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'

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

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

于 2013-10-08T11:09:14.027 回答
0

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

于 2013-10-08T11:14:43.710 回答