В чем разница между #include <filename>и #include "filename"? - PullRequest
2063 голосов
/ 22 августа 2008

В языках программирования C и C ++, в чем разница между использованием угловых скобок и использованием кавычек в операторе include следующим образом?

  1. #include <filename>
  2. #include "filename"

Ответы [ 31 ]

12 голосов
/ 12 марта 2018

#include <file.h> говорит компилятору искать заголовок в его каталоге "includes", например, для MinGW компилятор будет искать file.h в C: \ MinGW \ include \ или везде, где установлен ваш компилятор.

#include "file" указывает компилятору искать в текущем каталоге (то есть в каталоге, в котором находится исходный файл) значение file.

Вы можете использовать флаг -I для GCC, чтобы сообщить ему, что, когда он встречает включение с угловыми скобками, он должен также искать заголовки в каталоге после -I. GCC будет обрабатывать каталог после флага, как если бы это был каталог includes.

Например, если у вас есть файл с именем myheader.h в вашем собственном каталоге, вы можете сказать #include <myheader.h>, если вы вызвали GCC с флагом -I . (указывая, что он должен искать включения в текущем каталоге.)

Без флага -I вам придется использовать #include "myheader.h" для включения файла или переместить myheader.h в каталог include вашего компилятора.

12 голосов
/ 12 апреля 2018

Когда вы используете #include , препроцессор ищет файл в каталоге заголовочных файлов C \ C ++ (stdio.h \ cstdio, string, vector и т. Д.). Но, когда вы используете #include «filename»: во-первых, препроцессор ищет файл в текущем каталоге, а если нет - ищет его в каталоге заголовочных файлов C \ C ++.

12 голосов
/ 08 февраля 2011

Для #include "" компилятор обычно ищет папку в файле, который содержит эту папку, а затем другие папки. Для #include <> компилятор не ищет папку текущего файла.

10 голосов
/ 17 декабря 2012
  • #include <> для предопределенных заголовочных файлов

Если файл заголовка задан заранее, вы просто пишете имя файла заголовка в угловых скобках, и это будет выглядеть так (при условии, что у нас есть предопределенное имя файла заголовка iostream):

#include <iostream>
  • #include " " для заголовочных файлов, которые программист определяет

Если вы (программист) написали свой собственный файл заголовка, вы бы написали имя файла заголовка в кавычках. Итак, предположим, что вы написали заголовочный файл с именем myfile.h, тогда это пример того, как вы бы использовали директиву include для включения этого файла:

#include "myfile.h"
9 голосов
/ 08 февраля 2011

#include с угловыми скобками будет искать «список мест, зависящий от реализации» (что является очень сложным способом сказать «системные заголовки») для включаемого файла.

#include с кавычками будет просто искать файл (и, "в зависимости от реализации", bleh). Это означает, что на обычном английском языке он будет пытаться применить путь / имя файла, который вы выбрасываете в нем, и не будет предварять системный путь или изменять его в противном случае.

Кроме того, в случае сбоя #include "" он по умолчанию перечитывается как #include <>.

Документация gcc имеет (специфичное для компилятора) описание, которое, хотя и является специфическим для gcc, но не стандартом, намного проще для понимания, чем разговоры о стандартах ISO в стиле адвоката.

8 голосов
/ 23 января 2017
#include <abc.h>

используется для включения файлов стандартной библиотеки. Таким образом, компилятор проверит местоположения, в которых находятся заголовки стандартной библиотеки.

#include "xyz.h"

скажет компилятору включить пользовательские заголовочные файлы. Таким образом, компилятор проверит наличие этих заголовочных файлов в текущей папке или -I определенных папках.

8 голосов
/ 25 февраля 2014

Многие из ответов здесь сосредоточены на путях, которые компилятор будет искать, чтобы найти файл. Хотя это то, что делает большинство компиляторов, соответствующий компилятор может быть предварительно запрограммирован с эффектами стандартных заголовков и обрабатывать, скажем, #include <list> как переключатель, и он вообще не должен существовать как файл. *

Это не чисто гипотетически. Есть по крайней мере один компилятор, который работает таким образом. Рекомендуется использовать #include <xxx> только со стандартными заголовками.

8 голосов
/ 29 сентября 2011
#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"
6 голосов
/ 17 февраля 2016

В C ++ включить файл можно двумя способами:

Первый из них - #include, который указывает препроцессору искать файл в предопределенном местоположении по умолчанию. Это местоположение часто является переменной среды INCLUDE, которая обозначает путь для включения файлов.

И второй тип - #include «filename», который указывает препроцессору сначала искать файл в текущем каталоге, а затем искать его в предопределенных местоположениях, установленных пользователем.

6 голосов
/ 28 марта 2018

"<имя файла>" ищет в стандартных местах библиотеки C

, тогда как "filename" также выполняет поиск в текущем каталоге.

В идеале вы должны использовать <...> для стандартных библиотек C и "..." для библиотек, которые вы пишете и присутствует в текущем каталоге.

...