#include везде

Используется ли #include <file> для заголовков или это просто механический "вводят этот код здесь", который можно использовать где угодно в коде?

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

Ответ 1

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

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

Ответ 2

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

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;
}

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

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

Ответ 3

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

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

#include "/dev/console"

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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