【问题标题】:Why does lint complain "Warning 446: side effect in initilizer", lint e446 for the code below?为什么 lint 抱怨“警告 446:初始化程序中的副作用”,lint e446 用于下面的代码?
【发布时间】:2014-04-15 11:48:20
【问题描述】:

我需要帮助来理解为什么 lint 由于 struct 初始化而抱怨下面的代码。 代码运行没有任何问题,或者至少没有任何已知问题

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 一整天都很开心。

【问题讨论】:

  • 糟糕错过了 ;在示例代码中,但在实际代码中这不是问题。
  • m_MyMsgKey 是什么?
  • 错字 m_My 应该是 myMap 而 MsgKey 应该是 MskKey_t

标签: c++ linux lint


【解决方案1】:

lint 可以在初始化中引用operator -&gt; 吗?这可能会产生副作用,具体取决于迭代器的实现。

【讨论】:

    【解决方案2】:

    根据C++lint documentation,是这个原因:

    自动聚合(数组、结构和联合)通常是 由一组常量值表达式初始化,没有 副作用。编译器可以支持副作用,在这种情况下你 可能想要禁止显示此消息。

    这些完全有可能不是恒定的,并且可能会产生副作用:

    subKey-&gt;second.first-&gt;type, subKey-&gt;second.first-&gt;index, subKey-&gt;second.first-&gt;signal

    由于您的 memcpy 在技术上并未遵循典型的初始化,只是移动字节,因此 lint 不会警告您。它会让你这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2012-07-03
      相关资源
      最近更新 更多