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

在调试程序时出现了下面的问题,说找不到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编程规范里面提到的规范就好!!

"vs 2022 c 万能头文件不到"的问题可能是由于以下几个原因造成的: 首先,万能头文件本身并不存在。在C语言开发,并没有所谓的万能头文件,不能指望通过引入一个头文件来解决所有问题。 其次,如果是说在Visual Studio 2022的C语言项目不到某个特定的头文件,可能是由于以下几种情况产生的: 1. 该头文件并没有在项目的头文件搜索路径。您可以检查一下项目设置的头文件搜索路径是否包含了该头文件所在的目录。 2. 头文件的文件名或路径有误。请确保您引用的头文件的文件名和路径是正确的,如果文件名大小写不匹配,也有可能导致不到问题。 3. 头文件可能不在正确的文件夹。确保您正在引用的头文件实际上存在于您指定的文件夹。您可以检查一下头文件的位置是否正确。 4. 头文件可能没有正确安装或配置。有些头文件可能需要安装特定的库或软件包,或者需要进行一些额外的配置步骤,才能正常使用。您可以查阅相关文档或参考其他资源,了解该头文件的安装和配置需求。 总结来说,如果在Visual Studio 2022的C语言项目不到某个头文件,应该首先检查头文件的路径和名称是否正确,并确保该头文件在项目的头文件搜索路径。如果问题仍然存在,可能需要进一步查阅相关文档或寻求其他资源的帮助来解决。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值