在include指令中使用尖括号和引号有什么区别?

#包括<文件名>#包括“文件名”


当前回答

按照标准-是的,它们是不同的:

表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由<和>分隔符之间的指定序列唯一标识的头,并用头的全部内容替换该指令。如何指定位置或标识标题是实现定义的。表单的预处理指令#包括“q-char-sequence”新行导致用“分隔符”之间的指定序列标识的源文件的全部内容替换该指令。将以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则会像读取指令一样重新处理该指令#包含<h-char-sequence>新行具有与原始文件相同的包含序列(包括>个字符,如果有)指令。表单的预处理指令#包含pp令牌新行(与前两种形式之一不匹配)。指令中include之后的预处理标记与普通文本中的处理相同。(当前定义为宏名称的每个标识符由其预处理令牌的替换列表替换。)所有替换后产生的指令应与前两种形式之一匹配。实现定义了一种方法,通过该方法,<和>预处理令牌对或一对“字符”之间的一系列预处理令牌组合成单个标头名称预处理令牌。定义:h-char:源字符集的任何成员,除了换行符和>q-char:源字符集的任何成员,除了换行符和“

注意,标准没有说明实现定义的方式之间的任何关系。第一个表单以一种实现定义的方式进行搜索,另一个表单以(可能是其他)实现定义的方法进行搜索。该标准还规定应存在某些包含文件(例如,<stdio.h>)。

从形式上讲,您必须阅读编译器的手册,但通常(按照传统)#include“…”表单会搜索首先找到#include的文件目录,然后搜索#include<…>的目录表单搜索(包括路径,例如系统标题)。

其他回答

#包括<文件名>

预处理器以依赖于实现的方式进行搜索。它告诉编译器搜索系统头文件所在的目录。此方法通常用于查找标准头文件。

#包括“文件名”

这告诉编译器在程序运行的地方搜索头文件。如果失败,它的行为类似于#include<filename>,并在存储系统头文件的位置搜索该头文件。此方法通常用于标识用户定义的头文件(由用户创建的头文件)。如果您想调用标准库,请不要使用它,因为它比#include<filename>需要更多的编译时间。

这里的许多答案都集中在编译器搜索文件的路径上。虽然这是大多数编译器所做的,但一个符合标准的编译器可以使用标准头的效果进行预编程,并将#include<list>视为一个开关,它根本不需要作为一个文件存在。

这不是纯粹的假设。至少有一个编译器可以这样工作。建议仅对标准标头使用#include<xxx>。

#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"

GCC文件说明了两者之间的区别:

使用预处理指令“#include”包括用户和系统头文件。它有两种变体:#包含<文件>此变体用于系统头文件。它在系统目录的标准列表中搜索名为file的文件。您可以使用-I选项将目录添加到此列表中(请参阅调用)。#包含“文件”此变体用于您自己程序的头文件。它首先在包含当前文件的目录中搜索名为file的文件,然后在引号目录中搜索,然后在与<file>相同的目录中查找。您可以使用-iquote选项将目录添加到报价目录列表中。“#include”的参数(无论是用引号还是尖括号分隔)的行为与字符串常量相似,因为注释无法识别,宏名称也不会展开。因此,#include<x/*y>指定包含名为x/*y的系统头文件。然而,若反斜杠出现在文件中,则它们被视为普通文本字符,而不是转义字符。不处理适用于C中字符串常量的字符转义序列。因此,#include“x\n\\y”指定包含三个反斜杠的文件名。(有些系统将“\”解释为路径名分隔符。所有这些系统也以相同的方式解释“/”。仅使用“/”最为方便。)如果文件名后面的行中有任何内容(注释除外),则为错误。

在C++中,以两种方式包含文件:

第一个是#include,它告诉告诉在预定义的默认位置查找文件。此位置通常是INCLUDE环境变量,表示包含文件的路径。

第二种类型是#include“filename”,它告诉预处理器首先在当前目录中查找文件,然后在用户设置的预定义位置查找文件。