C ++ Visual Studio编译器警告C4800:' int' :强迫价值飙升' true'或者' false'

时间:2018-01-25 07:01:14

标签: c++ visual-studio

以下代码抛出警告C4800:' int' :强迫价值飙升' true'或者' false' (绩效警告)。在字符串和映射标题包含没有抛出此警告之后移动#define true和false。这是一个示例代码,在实际代码中,#define true和false在我们的产品库头文件中定义。所以我想理解为什么视觉工作室抛出这个警告,以及为什么当#define在字符串和地图标题包含之后移动时它会消失。

#ifndef true
#define true    1
#endif

#ifndef false
#define false   0
#endif

#include <string>
#include <map>

int main()
{
    std::map<std::string, std::string> pair;
    pair.insert(std::make_pair("Key1", "Value1"));
    return 0;
}

警告的全部细节:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\utility(144): warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtree(1801) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool>::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,int,void>(_Other1 &&,_Other2 &&)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Other1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,std::string>>>>
1>  ,            _Other2=int
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtree(1801) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool>::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,int,void>(_Other1 &&,_Other2 &&)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Other1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,std::string>>>>
1>  ,            _Other2=int
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtree(1160) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::_Insert_nohint<std::pair<const _Kty,_Ty>&,std::_Tree_node<std::pair<const _Kty,_Ty>,void *>*>(bool,_Valty,_Nodety)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Pr=std::less<std::string>
1>  ,            _Alloc=std::allocator<std::pair<const std::string,std::string>>
1>  ,            _Valty=std::pair<const std::string,std::string> &
1>  ,            _Nodety=std::_Tree_node<std::pair<const std::string,std::string>,void *> *
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtree(1160) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::_Insert_nohint<std::pair<const _Kty,_Ty>&,std::_Tree_node<std::pair<const _Kty,_Ty>,void *>*>(bool,_Valty,_Nodety)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Pr=std::less<std::string>
1>  ,            _Alloc=std::allocator<std::pair<const std::string,std::string>>
1>  ,            _Valty=std::pair<const std::string,std::string> &
1>  ,            _Nodety=std::_Tree_node<std::pair<const std::string,std::string>,void *> *
1>          ]
1>          Source.cpp(41) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert<std::pair<const char *,const char *>>(_Valty &&)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Pr=std::less<std::string>
1>  ,            _Alloc=std::allocator<std::pair<const std::string,std::string>>
1>  ,            _Valty=std::pair<const char *,const char *>
1>          ]
1>          Source.cpp(41) : see reference to function template instantiation 'std::pair<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,bool> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert<std::pair<const char *,const char *>>(_Valty &&)' being compiled
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::string
1>  ,            _Pr=std::less<std::string>
1>  ,            _Alloc=std::allocator<std::pair<const std::string,std::string>>
1>  ,            _Valty=std::pair<const char *,const char *>
1>          ]

2 个答案:

答案 0 :(得分:3)

我没有纵容您的宏,但问题的答案是您的支票几乎没有完成。在C ++中,truefalse是关键字,而不是像C&#39 {1}标题中的宏。因此,检查它们是否未被定义总是如此。如果你想要C ++ - 证明这些宏,条件应该是这样的:

stdbool.h

#if !defined(__cplusplus) && !defined(true) #define true 1 #endif 是一个标准宏,由TU编译为C ++时的实现定义。添加的检查将防止弄乱这些关键字,并打破使用它们的任何标准库标题。

答案 1 :(得分:0)

你说

  

#defines在我们的一个产品头文件中声明(不是我写的)

然后,您应该告诉编写此代码的人修改它。它可能是纯C代码(其中未定义true / false)并且他决定声明它们,为什么不,但是,然而,我认为好的策略是他不使用标准名称true / false在你的情况下最终与标准冲突相冲突。他应该使用MyTrue / MyFalse(或在上下文中有意义的名称)。

所以只是(或要求他)进入定义了true / false的代码,替换所有出现的&#34; true&#34; by&#34; MyTrue&#34;,all&#34; false&#34;通过&#34; MyFalse&#34;,代码行为不应受到影响。冲突将消失,警告也会消失!