下面的代码给了我警告:
初始化:静态符号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也没有,因为通常QAC/MISRA是在抱怨)。
而且,我的编译器是富士通软调Fs907s,可能什么都不值钱。
发布于 2013-10-08 11:09:14
如果您在网上搜索:
“初始化:静态符号的地址”用于符号
你会发现:
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,但是您的编译器警告您。为什么它觉得这个特别的东西是值得警告的,我不确定,但希望从这里你可以找出如何避免警告,或禁用它。
发布于 2013-10-08 11:14:43
此警告是为了避免暴露内部链接。在全局变量上的Word static将使变量与内部链接,这意味着内部的编译单元。
https://stackoverflow.com/questions/19245783
复制相似问题