以下代码抛出警告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> ]
答案 0 :(得分:3)
我没有纵容您的宏,但问题的答案是您的支票几乎没有完成。在C ++中,true
和false
是关键字,而不是像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;,代码行为不应受到影响。冲突将消失,警告也会消失!