ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Множественное включение заголовочного файла

Перечитываю раздел «Ошибка повторения включений» в учебнике Лафоре (стр.607-608).

Сначала автор напоминает о своей же рекомендации не вписывать в заголовочные файлы определения функций и глобальных переменных (рекомендуется держать в заголовочных файлах только объявления функций и глобальных переменных во избежание нарушения правила одного определения, описанного в предыдущем посте на эту тему; это нарушение возникнет, если заголовочный файл с определениями указанных программных элементов включить в несколько исходных файлов многофайловой программы). Цитата:

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


И тут же, на следующей странице, автор приводит пример (иллюстрирующий ошибку при включении в исходный файл одного и того же заголовочного файла несколько раз), в котором вписывает в заголовочный файл определение глобальной переменной. Цитата:
// файл headtwo.h
int globalVar;

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

Например, в статье википедии, посвященной «include guard» (примерный перевод на русский: «защитное условие во включаемом файле») в этом случае для примера использовано определение структуры:
https://ru.wikipedia.org/wiki/Include_guard

Цитата:
// файл grandfather.h
struct foo {
    int member;
};
Tags: Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments