2009-11-17 2 views
0

Можете ли файлы .h видеть, что находится друг в друге, не будучи включенным? Я знаю, когда я программировал на C, прежде чем я мог использовать переменные в файле .h из других .h файлов без #include "myfile.h". Я пытаюсь сделать то же самое в C++, и я продолжаю получать «определение из-за ошибки области».Файлы заголовков C++ простой вопрос

+0

Вы можете обновить переменные, необходимые как 'extern', чтобы предотвратить эту ошибку, но я не думаю, что это ваш – Earlz

+1

Читайте это: http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko

ответ

2

Не напрямую. Однако, если файл .cc или .c с файлом, то любые заголовки #include d после него будут см. Содержимое этого заголовка. Причина в том, что #include ведет себя как копирование и вставка: каждое содержимое файлов эффективно сбрасывается вместе в один большой файл, и компилятор видит только комбинированный результат. Например, если у вас есть:

foo.cc:

#include <a.h> 
#include <b.h> 
#include <c.h> 

// foo.cc's contents 

Даже если b.h не #include a.h, ее определения будут все еще в БиГ видимой, потому что компилятор видит содержимое всех как будто они были частью foo.cc. На практике это может быть довольно проблематичным, поскольку программы зависят от определений, которые они явно не включают. Когда кто-то меняет a.h, вы можете начать видеть ошибки в b.h (или в любом заголовке #include d после этого).

Но я не думаю, что это полностью отвечает на ваш вопрос, потому что этот процесс сам по себе не должен приводить к ошибкам «определения вне сферы действия». Учтите, чтобы опубликовать образец кода, который имеет проблему?

+0

Немного? '# include' является * точно * копированием и вставкой, вплоть до того, есть ли завершающая строка новой строки в последней строке включенного файла. – 2009-11-17 00:23:55

+0

@R. Пат: Да, но он также делает такие вещи, как добавление в директивы #line, поэтому компилятор знает файл и строку, на которой он должен быть включен. Но я согласен с тем, что важно подчеркнуть часть копии и вставки. Я отредактирую. – quark

+1

@ R.Pate: смешно, что вы должны использовать этот пример. В C++ поведение программы не определено, если какой-либо непустой исходный файл не имеет завершающей новой строки (2.1/1/2). Определение «исходного файла» охватывает то, что обычно называют «заголовочными файлами». Таким образом, это тот аспект, в котором он не обязательно эквивалентен копированию и вставке. Я предполагаю, что все или почти все препроцессоры реализуют его таким образом. GCC предупреждает о отсутствии новой строки. –

0

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

0

Нет, ни на C, ни на C++. Часто бывает, что заголовки включаются косвенно, что может произойти в вашем предыдущем опыте.

0

В C и C++ ничего не видно, если оно не загружено в скомпилированный блок (обычно .c или .cpp-файл), или если он явно объявлен.

Вы можете переадресовать объявить переменную с «Экстерн»

extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here 

компиляторов C Older может быть более мягким на необходимости вперед объявляющего.

Смежные вопросы