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

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


当前回答

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

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

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

其他回答

“”将搜索。/第一然后搜索默认包含路径。您可以使用以下命令打印默认包含路径:

gcc -v -o a a.c

以下是一些例子,让事情更清楚:代码交流工作

// a.c
#include "stdio.h"
int main() {
        int a = 3;
        printf("a = %d\n", a);
        return 0;

}

b.c的代码也有效

// b.c
#include <stdio.h>
int main() {
        int a = 3;
        printf("a = %d\n", a);
        return 0;

}

但当我在当前目录中创建名为stdio.h的新文件时

// stdio.h
inline int foo()
{
        return 10;
}

a.c将生成编译错误,但b.c仍然有效

和“”,<>可以与相同的文件名一起使用。因为搜索路径优先级不同。所以直流电也起作用

// d.c
#include <stdio.h>
#include "stdio.h"
int main()
{
        int a = 0;

        a = foo();

        printf("a=%d\n", a);

        return 0;
}

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

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

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

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

#包括<文件名>

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

#包括“文件名”

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

带有尖括号的#include将搜索“依赖于实现的位置列表”(这是一种非常复杂的方式来表示“系统头”)以查找要包含的文件。

带引号的#include将只搜索文件(并且,“以依赖于实现的方式”,bleh)。这意味着,在正常的英语中,它将尝试应用你扔给它的路径/文件名,而不会预先设置系统路径或篡改它。

此外,如果#include“”失败,则标准会将其重新读取为#include<>。

gcc文档有一个(特定于编译器的)描述,虽然它是特定于gcc而非标准的,但它比ISO标准的律师式描述更容易理解。