【发布时间】:2016-10-18 18:36:38
【问题描述】:
我有一个本地文件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 在我的 makefile 中生成的包含路径导致 /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
我的印象是(明显错误的)尖括号包括搜索的系统路径,而quote包括搜索使用-I指定的路径。
使用包含路径-I./src,如果我来自./src/foo/foo.h 的#include "bar/bar.h",即使它不是foo 子目录的本地(即:它使用-I./src 包含路径找到bar/bar.h ),我想这解释了我对每个包含类型含义的印象。
但是,这些似乎也会影响系统包含的查找方式(或者至少,尖括号包含的查找方式)。对吗?
在不强制我重命名本地 endian.h 文件的情况下,解决此问题的唯一方法是删除该包含路径吗?
【问题讨论】:
-
"" 相对于当前源文件, 相对于包含路径中的所有条目。
-
endian.h 是 Linux 的一部分,也许可以使用更合理的名称。
-
@usr1234567 当我将
""用于相对于当前源文件不的文件时,它是如何工作的? -
@usr1234567 您是否建议只有一个文件实例的名称才能被认为是正常的?恕我直言,这听起来比理智更疯狂?
-
避免名称冲突是明智的。它排除了一大堆可能难以检测的错误。
标签: c++ gcc makefile cmake g++