#include <> and #include “”
Possible Duplicate:
what is the difference between #includeand #include “filename”
除了编译器将搜索的路径之外,这两个include语法之间是否存在根本区别?
我觉得英特尔的编译器不能给出完全相同的输出。
基本的区别在于搜索路径。
你应该使用尖括号形式的"系统"包括,定期报价项目本地包括。
C语言标准规定,
当标准提到"headers"时,它根本就没有特别提到文件。该标准不要求标题作为文件存在。它们可以内置到编译器中,以满足所有标准要求。
因此,
实际上,编译器对
丹·莫德尔做对了;放松,哈克,尼克·巴斯汀做错了。对不起的。
1 | #include <...> |
对于头文件,甚至不需要文件系统中的文件,但可以是编译器内部的。
1 | #include"..." |
对于文件,只有在找不到这样的文件时,才会默认返回到
这些头文件和文件的查找方式和位置,以及是否应将<>用于系统文件和""用于项目文件,这确实是一种常见的约定,完全取决于编译器和项目。
C标准(ISO/IEC 9899:1999)规定(强调我的):
6.10.2 Source file inclusion
Constraints
A
#include directive
shall identify a header or source file
that can be processed by the
implementation.Semantics
A preprocessing directive of the form
#include new-line searches a sequence of
implementation-defined places for a
header identified uniquely by the
specified sequence between the < and >
delimiters, and causes the replacement
of that directive by the entire
contents of the header. How the places
are specified or the header identified
is implementation-defined.A preprocessing directive of the form
#include"q-char-sequence" new-line causes the replacement of that
directive by the entire contents of
the source file identified by the
specified sequence between the"
delimiters. The named source file is
searched for in an > implementation-defined manner.
If this
search is not supported, or if the
search fails, the directive is
reprocessed as if it read
#include new-line with the identical
contained sequence (including >
characters, if any) from the original
directive.
引号指示首先在当前目录中搜索,然后在系统目录中搜索(在编译器/预处理器中硬编码的路径或用
编译器输出肯定不依赖于引号,因为它是在预处理阶段处理的。除此之外,当由于改变了搜索行为时,会包含不同的文件。
对于gcc编译器来说,<>和"headers"之间存在差异。如果从作为-issystem提供给预处理器的目录中包含<>header,则不会对包含的头发出警告。在某些情况下,这会产生巨大的差异。
英特尔编译器也有-issystem指令,因此它也可能适用于ICC。
更不用说查找目录中的差异太明显了。
将检查系统包含路径(包括为项目添加的任何其他路径)。
将检查应用程序工作文件夹。(即与包含include语句的源文件相同的文件夹)。
警告:这纯粹是猜测。我对英特尔编译器没有足够的经验来了解它是否可以这样工作,我也不知道有什么编译器可以这样做。
如果编译器实现预编译的头文件,它可能会将这些头文件用于包含的一种形式,而不是另一种形式。如果预编译的头文件与实际头文件不同步,您将根据所包含的内容获得不同的结果。
一般来说,没有技术上的差异,任何人告诉你的关于它的一切都只是本地风格,可能受到过去编译器的影响-许多现代编译器以完全相同的方式实现初始搜索(通常其他常见的行为可以通过命令行选项获得)。该标准将行为交给实现人员处理,没有支持这两种语法的特殊理由。
根据ISO C99标准第6.10.2节,定义了<>和"的搜索路径。在标准的眼里,它们之间唯一的区别是,如果不能解决问题,"使用"将退回<>状态。(不要被似乎要区分"头文件"和"源文件"的标准绊倒——除了保留某些名称-"stdio.h"等之外,标准实际上没有定义任何差异。)