本地包含路径隐藏系统头文件
gcc: local include path hides system header file
我有一个本地文件endian.h
,它声明了一些字节交换函数。
#pragma once
#include <cstdint>
inline uint16_t bswap(uint16_t val) { return __builtin_bswap16(val); }
inline uint32_t bswap(uint32_t val) { return __builtin_bswap32(val); }
...
似乎包含路径CMake生成在我的makefiles导致/usr/include/endian.h
从/usr/include/ctype.h
隐藏,而不是解析到./src/foo/endian.h
In file included from /usr/include/ctype.h:39:0,
from /usr/include/c++/5/cctype:42,
...
from ./src/foo/session.h:3
./endian.h: In function ‘uint32_t bswap(uint32_t)’:
./endian.h:17:36: error: conflicting declaration of C function ‘uint32_t bswap(uint32_t)’
inline uint32_t bswap(uint32_t val) { return __builtin_bswap32(val); }
其中一个包含路径是当前目录,与endian.h
文件所在的目录相同:-I ./src/foo
是这个路径导致/usr/include/endian.h
被隐藏
:
g++ -I./src ./src/foo/session.cpp
破碎:
g++ -I./src -I./src/foo ./src/foo/session.cpp
我有一个(明显错误的)印象,尖括号包括搜索系统路径,而引号包括搜索使用-I
指定的路径。
包含路径-I./src
,如果我#include "bar/bar.h"
从./src/foo/foo.h
,工作,即使它不是本地的foo
子目录(即:它找到bar/bar.h
使用-I./src
包含路径),我想这解释了我的印象关于什么每个包含类型的意思。
不强迫我重命名我的本地endian.h
文件,是唯一的方法来解决这个问题,以删除该包含路径?
以下是gcc手册中关于include搜索顺序的说明:
查找顺序如下:
- 对于include指令的quote形式,首先搜索当前文件的目录。
- 对于include指令的引用形式,由-iquote选项指定的目录将按照从左到右的顺序搜索,如它们出现在命令行上。
- 使用-I选项指定的目录按从左到右的顺序扫描。
- 用- issystem选项指定的目录按从左到右的顺序扫描。
- 扫描标准系统目录
- 用- dirafter选项指定的目录按从左到右的顺序扫描。
可以看到,-I
选项(3)包含的文件在标准系统目录(5)(其中包括/usr/include
)之前搜索。
所以一般来说,你用-I
添加的目录中的文件将隐藏同名的系统头文件,不管这些文件是包含在<>
还是""
中。
""
和<>
之间的区别在于,""
包含的文件首先搜索当前目录(以及-iquote
目录,但这更加模糊)。因此,如果您包含一个像#include "foo/bar.h"
这样的文件,并且该文件包含"endian.h",那么如果foo/endian.h
存在,它将被使用,而不是来自标准包含目录的同名文件。但是,如果您使用#include <endian.h>
,则将使用系统版本。通过这种方式,如果使用正确的引号,可以减少两个方向上的意外名称冲突。
最初确实存在""
和<>
之间的区别。但是,目前,据我所知,所有主要的编译器都平等地对待这两者。就编译器如何处理它们而言,它们之间实际上没有区别。人们习惯使用这些符号。endian.h
是一个标准标头,通用名称。你应该把它往下移动一个文件夹,以避免名称冲突,比如"myProject/endian.h"
,或者把名字改成一个更明确的。
- 在UNIX系统中使用DIR查找文件的字节大小
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- C++系统找不到指定的文件错误
- libstdc++ 文件系统中未初始化的用法?
- boost::文件系统::recursive_directory_iterator多线程安全
- C++17 文件系统::remove_all 带有通配符路径
- 实验性文件系统库不完整C++?
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- C++ - 如何读取系统文件
- 静态链接如何处理系统文件?
- 无法指定系统文件
- 卸载程序不会删除复制到VS2010安装程序项目中的系统文件夹。
- 我可以根据系统文件中某处的不同系统加载默认窗口图标吗?
- 系统文件,读写创建自定义元数据或扩展属性
- 将系统(文件)命令的输出作为字符串存储在C中
- 如何使用C/C++以编程方式检查窗口中的系统文件夹
- C++系统文件位/stat.h 突然中断"error: field ‘st_atim’ has incomplete type"