由于struct
初始化,我需要帮助理解为什么lint会抱怨下面的代码。
代码运行没有任何问题,或者至少是
struct MsgKey_t {
int type;
int index;
int signal;
};
typedef std::map< int, std::pair< MsgKey_t*, int* > > MyMap_t;
MyMap_t myMap;
MyMap_t::iterator subKey = myMap.find( 11 );
if ( myMap.end() == subKey )
{
exit(-1);
}
MsgKey_t key = { subKey->second.first->type, subKey->second.first->index, subKey->second.first->signal };
如果我将结构的初始化更改为:
MsgKey_t key;
memcpy( &key, subKey->second.first, sizeof( key ) );
或:
MsgKey_t* pKey = subKey->second.first;
MsgKey_t key = { pKey->type, pKey->index, pKey->signal };
lint整天都很开心。
答案 0 :(得分:0)
根据C++lint documentation,这就是原因:
自动聚合(数组,结构和联合)通常是 由一组常量值表达式初始化而没有 副作用。在这种情况下,编译器可以支持副作用 可能想要取消此消息。
完全有可能这些不是恒定的,可能会产生副作用:
subKey->second.first->type, subKey->second.first->index, subKey->second.first->signal
由于你的memcpy
在技术上并不遵循典型的初始化,只是移动字节,lint不会警告你。它会让你这样做。