在一个更完美的世界中,也许编译器/链接器会标记歧义,但我认为情况并非如此。我希望有人知道。
更清楚:
cc -c foo.c -Ithis_directory_contains_foo_h -Iso_does_this_one
C 2018 6.10.2 2 指定
#include
使用 <name>
`:
… 在一系列实现定义的位置中搜索由
和<
分隔符之间的指定序列唯一标识的标头,并导致用标头的整个内容替换该指令。如何指定位置或识别标头是实现定义的。>
将此与使用
#include
` 的 6.10.2 3 进行比较,省略“唯一标识”:
... 导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者如果搜索失败,该指令将被重新处理,就好像[它使用了 "name"
和
而不是<
]。 因此,对于>
"
和
<
,标题应该是唯一的。然而,第 2 段最后一句提供了很大的自由度;一个实现可以说,标头是通过第一个找到的具有该名称的标头来标识的,这将唯一地标识它。对于>
,标准并没有说header应该唯一标识,所以如果有多个同名的header一般不会被认为是问题。
由于如何搜索位置以及如何识别标头是实现定义的,因此编译器可以按照其作者选择的任何顺序自由搜索它们,只要他们定义即可。对于命令行中指定的头目录,典型的编译器按照命令行中给出的顺序搜索它们。但是,它们与编译器内置的目录或通过环境指定的目录交互的方式可能会很复杂。 Clang 具有开关"
,用于在系统搜索路径的开头插入目录(对于
-isystemdirectory
和 <
而言),>
用于在系统搜索路径的末尾附加目录,-isystemafterdirectory
到在常规搜索路径末尾附加一个目录等等。