在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
#include "filename" // User defined header
#include <filename> // Standard library header.
例子:
这里的文件名是Seller.h:
#ifndef SELLER_H // Header guard
#define SELLER_H // Header guard
#include <string>
#include <iostream>
#include <iomanip>
class Seller
{
private:
char name[31];
double sales_total;
public:
Seller();
Seller(char[], double);
char*getName();
#endif
在类实现中(例如,Seller.cpp,以及将使用文件Seller.h的其他文件中),现在应该包含用户定义的头,如下所示:
#include "Seller.h"
其他回答
了解的唯一方法是阅读实现的文档。
在C标准第6.10.2节第2至4段中规定:
表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由<和>分隔符之间的指定序列唯一标识的头,并用头的全部内容替换该指令。如何指定位置或标识标题是实现定义的。表单的预处理指令#包括“q-char-sequence”新行导致用“分隔符”之间的指定序列标识的源文件的全部内容替换该指令。将以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则会像读取指令一样重新处理该指令#包含<h-char-sequence>新行具有与原始文件相同的包含序列(包括>个字符,如果有)指令。表单的预处理指令#包含pp令牌新行(与前两种形式之一不匹配)。指令中include之后的预处理标记与普通文本中的处理相同。(当前定义为宏名称的每个标识符由其预处理令牌的替换列表替换。)所有替换后产生的指令应与前两种形式之一匹配。实现定义了一种方法,通过该方法,<和>预处理令牌对或一对“字符”之间的一系列预处理令牌组合成单个标头名称预处理令牌。定义:h-char:源字符集的任何成员,除了换行符和>q-char:源字符集的任何成员,除了换行符和“
表格1-#include<xxx>
首先,在调用指令的当前目录中查找头文件的存在。如果未找到,则在预配置的标准系统目录列表中进行搜索。
表格2-#包括“xxx”
这将查找在调用指令的当前目录中是否存在头文件。
确切的搜索目录列表取决于目标系统、GCC的配置方式以及安装位置。通过使用-v选项运行GCC编译器,可以找到GCC编译器的搜索目录列表。
您可以使用-Idir将其他目录添加到搜索路径中,这会导致在当前目录之后(对于指令的引号形式)和标准系统目录之前搜索dir。
基本上,表单“xxx”只是在当前目录中搜索;如果未找到,则返回表单
要使用gcc查看系统上的搜索顺序,根据当前配置,可以执行以下命令。您可以在此处找到有关此命令的详细信息
cpp-v/dev/null-o/dev/null
Apple LLVM版本10.0.0(clang-1000.10.44.2)目标:x86_64-apple-darwin18.0.0线程模型:posix InstalledDir:Library/Developer/CommandLineTools/usr/bin“/Library/Developer/CommandLineTools/usr/bin/clag”-cc1-三重x86_64-apple-macsx10.14.0-不推荐使用objc-Weror=已弃用的objc isa用法-E-禁用free-禁用llvm验证器-丢弃值名称-主文件名null-mrelocation model pic-pic level 2-mthread model posix-mdisable fp elim-fno strict return-masm verbose-munwind tables-target cpu penryn-dwarf column info-debugger tuning=lldb-target linker version 409.12-v-resource-dir/库/开发人员/命令行工具/usr/lib/clag/10.0.0-isysroot/库/开发人员/命令行工具/sdk/MacOSX10.14.sdk-我/usr/local/include-fdebug compilation dir/Users/hogstrom-fferror limit 19-fmessage长度80-堆栈保护器1-fblocks-fencode扩展块签名-fbojc runtime=macosx-10.14.0-fmax type align=16-fdiagnostics show option-fcolor diagnostics-传统cpp-o-x c/dev/nullclang-cc1版本10.0.0(clang-1000.10.44.2)默认目标x86_64-apple-darwin18.0.0忽略不存在的目录“/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/local/include”忽略不存在的目录“/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/Libraries/Frameworks”#包括“…”搜索从这里开始:#包括<…>搜索从这里开始:/usr/local/include/库/开发人员/命令行工具/usr/lib/clag/10.0.0/include/库/开发人员/命令行工具/usr/include/库/开发人员/命令行工具/sdk/MacOSX10.14.sdk/usr/include/库/开发人员/命令行工具/SDKs/MacOSX10.14.sdk/System/Library/Frameworks(框架目录)搜索列表结束。
<file>include告诉预处理器首先在-I目录和预定义目录中搜索,然后在.c文件的目录中搜索。“file”include告诉预处理器首先搜索源文件的目录,然后返回到-I并预定义。无论如何都会搜索所有目的地,只是搜索顺序不同。
2011年标准主要讨论了“16.2源文件包含”中的包含文件。
2表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由在<和>分隔符之间指定的序列,并导致用标题的全部内容替换该指令。如何指定位置或标识标题定义了实现。3表单的预处理指令#包括“q-char-sequence”新行导致将该指令替换为在“分隔符”之间指定的序列。命名的源文件是以实现定义的方式搜索。如果此搜索是不受支持,或者如果搜索失败,指令将被重新处理为如果它读#包含<h-char-sequence>新行与原始指令相同的包含序列(包括>个字符,如果有)。
请注意,如果找不到文件,“xxx”格式将降级为<xxx>格式。其余部分由实现定义。
GCC文件说明了两者之间的区别:
使用预处理指令“#include”包括用户和系统头文件。它有两种变体:#包含<文件>此变体用于系统头文件。它在系统目录的标准列表中搜索名为file的文件。您可以使用-I选项将目录添加到此列表中(请参阅调用)。#包含“文件”此变体用于您自己程序的头文件。它首先在包含当前文件的目录中搜索名为file的文件,然后在引号目录中搜索,然后在与<file>相同的目录中查找。您可以使用-iquote选项将目录添加到报价目录列表中。“#include”的参数(无论是用引号还是尖括号分隔)的行为与字符串常量相似,因为注释无法识别,宏名称也不会展开。因此,#include<x/*y>指定包含名为x/*y的系统头文件。然而,若反斜杠出现在文件中,则它们被视为普通文本字符,而不是转义字符。不处理适用于C中字符串常量的字符转义序列。因此,#include“x\n\\y”指定包含三个反斜杠的文件名。(有些系统将“\”解释为路径名分隔符。所有这些系统也以相同的方式解释“/”。仅使用“/”最为方便。)如果文件名后面的行中有任何内容(注释除外),则为错误。