Заголовочный файл включен только один раз во всей программе?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

25
задан Brian Tompsett - 汤莱恩 26 May 2016 в 15:07
поделиться

2 ответа

«Файл заголовка» фактически вставляется препроцессором перед началом компиляции. Просто думайте об этом как о «замене» его директивы #include.

Страж ...

#ifndef MY_HEADER_H
#define MY_HEADER_H

....

#endif

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

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

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

Примечание: это в основном для C . Для C ++ есть существенные различия, поскольку классы и т. Д. Добавляют дополнительную сложность тому, что / когда допускается несколько глобальных объектов.

16
ответ дан too honest for this site 26 May 2016 в 15:07
поделиться

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

5
ответ дан Bryan Shaw 26 May 2016 в 15:07
поделиться