0

我在我的项目中收到以下警告(发布和调试模式):

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concurrent_vector.h(1599): warning C4189: '_Array' : local variable is initialized but not referenced
      C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concurrent_vector.h(1598) : while compiling class template member function 'void Concurrency::concurrent_vector<_Ty>::_Destroy_array(void *,Concurrency::concurrent_vector<_Ty>::size_type)'
      with
      [
          _Ty=Vector3i
      ]
      d:\Some_path\somefile.h(780) : see reference to class template instantiation 'Concurrency::concurrent_vector<_Ty>' being compiled
      with
      [
          _Ty=Vector3i
      ]

somefile.h 是我的文件,第 780 行有以下代码:

Concurrency::concurrent_vector<Vector3i> m_ovColors;

Vector3i 是这样的:

template<typename T> class TVector3 {
public:
    T x, y, z;
}

typedef TVector3<int>           Vector3i;

concurrent_vector.h 中第 1598 行的代码是(第 1598 行只是'{'):

template<typename _Ty, class _Ax>
void concurrent_vector<_Ty, _Ax>::_Destroy_array( void* _Begin, size_type _N ) 
{
    _Ty* _Array = static_cast<_Ty*>(_Begin);
    for( size_type _J=_N; _J>0; --_J )
        _Array[_J-1].~_Ty(); // destructors are supposed to not throw any exceptions
}

这可能是什么原因?这个 somefile.h 当包含在其他项目中时不会发出那种警告。

4

3 回答 3

3

问题是由于内联,代码变成了这个:

_Ty* _Array = static_cast<_Ty*>(_Begin);
for( size_type _J=_N; _J>0; --_J )
    ; // destructor has no effect!

此时,编译器停止并检查是否使用了所有已初始化的变量,并发出警告。

(然后代码将被优化为一个空函数:

; // variable is unused
; // loop has no effect

但此时警告已经发出。)

于 2012-04-20T20:39:03.500 回答
1

这种方法有效:

#pragma warning( disable : 4189 )
#include <concurrent_vector.h>
#pragma warning( default : 4189 )

谢谢大家

于 2012-04-25T17:39:47.400 回答
1

也许编译器正在优化循环而不是static_cast. 您是否有程序相关部分的汇编程序/源代码列表?

我对 MSVC STL 的经验是,如果你用它编译,/W4你会得到很多误报。

于 2012-04-20T18:18:47.153 回答