在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
它确实:
"mypath/myfile" is short for ./mypath/myfile
具有是#include所在文件的目录和/或编译器的当前工作目录,和/或default_include_path
and
<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile
如果./在<default_include_paths>中,则不会有任何区别。
如果mypath/myfile位于另一个include目录中,则行为未定义。
其他回答
“<filename>”在标准C库位置搜索而“filename”也会在当前目录中搜索。
理想情况下,您可以使用<…>对于标准C库,“…”表示您编写的当前目录中的库。
#include<>用于预定义的头文件
如果头文件是预定义的,那么您只需将头文件名写在尖括号中,它看起来像这样(假设我们有一个预定义的头文件名iostream):
#include <iostream>
#include“”表示程序员定义的头文件
如果你(程序员)编写了自己的头文件,那么你会将头文件名用引号括起来。因此,假设您编写了一个名为myfile.h的头文件,那么这是如何使用include指令包含该文件的示例:
#include "myfile.h"
感谢您的回答,特别是Adam Stelmaszczyk和piCookie,以及aib。
与许多程序员一样,多年来,我一直使用“myApp.hpp”格式作为应用程序特定文件,使用<libHeader.hpp>格式作为库和编译器系统文件(即/I和INCLUDE环境变量中指定的文件)的非正式约定,认为这是标准。
然而,C标准规定搜索顺序是特定于实现的,这会使可移植性变得复杂。更糟糕的是,我们使用了jam,它可以自动找出包含文件的位置。可以为包含文件使用相对路径或绝对路径。即
#include "../../MyProgDir/SourceDir1/someFile.hpp"
旧版本的MSVS需要双反斜杠(\\),但现在不需要了。我不知道什么时候变了。为了与'nix兼容,只需使用正斜杠(Windows将接受这一点)。
如果您真的担心这个问题,请使用“./myHeader.h”作为源代码所在目录中的包含文件(我当前的大型项目中有一些重复的包含文件名--这确实是一个配置管理问题)。
为了方便起见,这里复制了MSDN说明)。
引用的表单预处理器按以下顺序搜索包含文件:在与包含#include语句的文件相同的目录中。在当前打开的include文件的目录中,按以下相反顺序他们被打开了。搜索从父包含文件的目录开始继续向上通过任何祖父母包含文件的目录。沿着每个/I编译器选项指定的路径。沿着INCLUDE环境变量指定的路径。角钢支架形式预处理器按以下顺序搜索包含文件:沿着每个/I编译器选项指定的路径。在命令行上进行编译时,沿着INCLUDE环境变量指定的路径进行编译。
#include <file>
包含默认包含目录所在的文件。
#include "file"
在编译文件的当前目录中包含文件。双引号还可以指定到其他位置的完整文件路径。
GCC文件说明了两者之间的区别:
使用预处理指令“#include”包括用户和系统头文件。它有两种变体:#包含<文件>此变体用于系统头文件。它在系统目录的标准列表中搜索名为file的文件。您可以使用-I选项将目录添加到此列表中(请参阅调用)。#包含“文件”此变体用于您自己程序的头文件。它首先在包含当前文件的目录中搜索名为file的文件,然后在引号目录中搜索,然后在与<file>相同的目录中查找。您可以使用-iquote选项将目录添加到报价目录列表中。“#include”的参数(无论是用引号还是尖括号分隔)的行为与字符串常量相似,因为注释无法识别,宏名称也不会展开。因此,#include<x/*y>指定包含名为x/*y的系统头文件。然而,若反斜杠出现在文件中,则它们被视为普通文本字符,而不是转义字符。不处理适用于C中字符串常量的字符转义序列。因此,#include“x\n\\y”指定包含三个反斜杠的文件名。(有些系统将“\”解释为路径名分隔符。所有这些系统也以相同的方式解释“/”。仅使用“/”最为方便。)如果文件名后面的行中有任何内容(注释除外),则为错误。