找不到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编程规范里面提到的规范就好!!

相关文章推荐

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

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

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...

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

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

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

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

编译错误之error C3861: “xxxx”: 找不到标识符

今天碰到了找不到标识符的错误!把几个问题总结一下。 我的编译错误是如下: 这个时候,我们一般往这几种情况去考虑。 第一种情况 我们看看是否包含sbc2dbc的文件是否包含进来。我们一查...

常用头文件及包含的函数

math.h常用函数 int  abs   (int x); double  acos  (double x); double  asin  (double x); double  atan  (d...

C语言:min和max头文件

C语言:min和max头文件

c++中min和max函数

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

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

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

opencv3实现图像修补-inpaint函数

#include #include using namespace std; using namespace cv; bool g_bDrawing = false; Point g_CurrPo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:找不到min和max标识符—C++中头文件次序问题
举报原因:
原因补充:

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