找不到min和max标识符—C++中头文件次序问题

转载 2015年07月08日 16:59:11

在调试程序时出现了下面的问题,说找不到min和max标识符。

1>c:\program files\microsoft sdks\windows\v7.0a\include\gdiplustypes.h(471): error C3861: “min”: 找不到标识符

1>c:\program files\microsoft sdks\windows\v7.0a\include\gdiplustypes.h(472): error C3861: “max”: 找不到标识符

后来在网上查了些资料说是第三方库头文件与系统头文件发生了冲突,又想到之前有大概看过的google编程规范,有专业讲包含文件的名称和次序这一块,果然。问题就出现在这里。先贴出里面讲到的规范:

将包含次序标准化可增强可读性、避免隐藏依赖(hidden dependencies,译者注:隐藏依赖主要是指包含的文件中编译时),次序如下:C库、C++库、其他库的.h、项目内的.h

项目内头文件应按照项目源代码目录树结构排列,并且避免使用UNIX文件路径.(当前目录)和..(父目录)。例如,google-awesome-project/src/base/logging.h应像这样被包含:

#include"base/logging.h"

dir/foo.cc的主要作用是执行或测试dir2/foo2.h的功能,foo.cc中包含头文件的次序如下:

    dir2/foo2.h(优先位置,详情如下)
    C
系统文件
    C++
系统文件
    
其他库头文件
    
本项目内头文件

这种排序方式可有效减少隐藏依赖,我们希望每一个头文件独立编译。最简单的实现方式是将其作为第一个.h文件包含在对应的.cc中。

dir/foo.cc和dir2/foo2.h通常位于相同目录下(像base/basictypes_unittest.cc和base/basictypes.h),但也可在不同目录下。

相同目录下头文件按字母序是不错的选择。

举例来说,google-awesome-project/src/foo/internal/fooserver.cc的包含次序如下:

#include"foo/public/fooserver.h"  // 优先位置

#include <sys/types.h>
#include <unistd.h>

#include <hash_map>
#include <vector>

#include"base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"

一开始cpp中的头文件顺序是:


后来将系统库的头文件提到前面来


问题就解决了,原因是opencv库与系统库冲突了,后来又看了哥们写的比较精典的贴:

http://www.uml.org.cn/c++/201203085.asp   C++头文件的包含顺序研究

里面分析的比较详细,里面还讲到编程思想提到的另一种头文件包含方式,也就是反过来,把标准库放在最后面,这样内部出现就会很容易发现,就如一开始的库冲突,但反过来又一想,库冲突的解决方法又是用到第一种包含方式,那还不如一直用google编程规范里面提到的规范就好!!

microsoft sdks\windows\v6.0a\include\gdiplustypes.h(658) : error C3861: 'min': identifier not found

周末调试mfc程序, 因为程序中要调用opencv的库。  但是出现了:microsoft sdks\windows\v6.0a\include\gdiplustypes.h(658) : erro...
  • nemo2011
  • nemo2011
  • 2013年09月16日 20:20
  • 5650

【解决方法】调试出现:error C3861: “max”,“min”: 找不到标识符。

将VC++ 6.0程序搬到VS2008上面时,调试
  • Just_Yu
  • Just_Yu
  • 2014年11月17日 22:01
  • 7481

VS2015--win32工程配置的一些想法之GdiplusTypes.h(470) : error C3861: 'min': identifier not found

一次一次地,乐此不疲的掉入自己挖的坑儿。之前博客《VS2015–win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突》写了如何处理algorithm中std:mi...
  • wangshubo1989
  • wangshubo1989
  • 2016年02月18日 00:06
  • 4873

c++中min和max函数

包含在c++标准库中头文件中,在头文件中定义了min,max的宏,若在包含的同时包含会导致函数无法使用。 提供了_cpp_min等函数来代替min函数的功能。 C++11标准:中min函数的原型 ...
  • u013349653
  • u013349653
  • 2016年04月12日 20:42
  • 33100

C/C++中的max/min函数宏定义问题

不要轻易修改自带的头文件,写代码一定要规范!
  • zjn21hx
  • zjn21hx
  • 2015年11月12日 22:59
  • 12977

找不到min和max标识符--C++中头文件次序问题

在调试程序时出现了下面的问题,说找不到min和max标识符。 1>c:\program files\microsoft sdks\windows\v7.0a\include\gdiplustypes....
  • LCMliao
  • LCMliao
  • 2014年03月19日 10:42
  • 8284

“max”: 不是“std”的成员 问题

使用VS2010编写的C++程序 std:min 转换到 VS2013,提示错误“min”: 不是“std”的成员 如何解决? 标准库在头中定义了两个模板函数std::min() 和 s...
  • tiandijun
  • tiandijun
  • 2016年08月03日 15:51
  • 3289

找不到min和max标识符--C++中头文件次序问题

在调试程序时出现了下面的问题,说找不到min和max标识符。 1>c:\program files\microsoft sdks\windows\v7.0a\include\gdiplustyp...
  • lzw66666
  • lzw66666
  • 2017年12月22日 14:03
  • 23

c++ 各种求min/max方法效率测试

由于min跟max是等价的,下面只对求min进行测试 每次测试执行min 109次,记录时间(单位:秒) 耗时以STL为参考基准运行环境 Windows 7 32-bit on Intel Pe...
  • Fallen_Breath
  • Fallen_Breath
  • 2016年10月18日 16:27
  • 454

TLD学习(1)-搭建环境

在跑demo的过程中出现以下错误。 Error: 无法找到"Program Files..." 解决办法:include和libpath中的opencv路径不能有空格。将opencv的安装包ext...
  • zinnc
  • zinnc
  • 2015年07月25日 15:35
  • 2063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:找不到min和max标识符—C++中头文件次序问题
举报原因:
原因补充:

(最多只允许输入30个字)