# включить в любом месте - PullRequest
12 голосов
/ 06 апреля 2011

#include <file> предназначен для использования только для заголовков, или это просто механическая «вставка этого кода здесь», которую можно использовать в любом месте кода?

Что если я использую ее в середине функции cpp, чтобы просто «внедрить» код из одного источника? это сработает или компиляторы будут кричать об этом?

Ответы [ 7 ]

19 голосов
/ 06 апреля 2011

Это является механическим , введите код здесь устройства.Вы можете включить текстовый файл, содержащий Faust Гете, если хотите.Вы можете поместить его где угодно, даже в середине функции (конечно, #include нужна новая строка!).

Однако строго рекомендуется использовать #include только для заголовочных файлов.Могут быть причины, по которым я не буду возражать против этого, например, добавление машинно-сгенерированного кода или объединение всех единиц перевода в один файл.

10 голосов
/ 06 апреля 2011

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

Animals.h:

ANIMAL(Anteater)
ANIMAL(Baboon)
...
ANIMAL(Zebra)

AnimalLibrary.h:

#define ANIMAL(name) name,

enum Animals {
#include "Animals.h"
        AnimalCount
    };

#undef ANIMAL

extern char * AnimalTable[AnimalCount];

AnimalLibrary.cpp:

#include "AnimalLibrary.h"

#define ANIMAL(name) #name,

char * AnimalTable[AnimalCount] = {
#include "Animals.h"
    };

main.cpp:

#include "AnimalLibrary.h"

int main()
{
    cout << AnimalTable[Baboon];
    return 0;
}

Убедитесь, что обычные включающие охранники не включены ни в один файл, который будет включен несколько раз!

Должен согласиться с Уильямом Перселлом , хотя в этой технике люди будут чесать свои головы.

7 голосов
/ 06 апреля 2011

Это будет работать - более или менее его семантическое значение таково: поместите код в этот файл здесь

РЕДАКТИРОВАТЬ: Для злоупотребления использованием #include я могу просто порекомендовать следующее:

#include "/dev/console"

Это учитывает все: однострочник, который может делать все, ошибка, просто вопрос компиляции ...

5 голосов
/ 06 апреля 2011

Компиляторы не будут жаловаться, но все, кто должен поддерживать код, будут.

1 голос
/ 06 апреля 2011

Должно работать, оно обрабатывается вашим препроцессором, ваш компилятор даже не увидит его.

0 голосов
/ 06 апреля 2011

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

Обычно вы делаете это для заголовочных файлов.Я видел, как это делается с файлами cpp во время создания шаблона (с правильным #ifdef, поэтому вы не включаете его несколько раз, вызывая ошибку определения нескольких символов).

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

0 голосов
/ 06 апреля 2011

# include и другие директивы препроцессора, такие как #define или #import, могут появляться в любом месте исходного кода, но будут применяться только к коду после этого включения.Он предназначен для включения ссылочного кода в исходный файл, который его вызывает.Эта страница MSDN объясняет это довольно хорошо.http://msdn.microsoft.com/en-us/library/36k2cdd4(v=VS.71).aspx

...