以下代码向我发出警告:
初始化:静态符号的地址' 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
答案 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
将使内部链接变为变量,这意味着编译单元内部。