Можете ли файлы .h видеть, что находится друг в друге, не будучи включенным? Я знаю, когда я программировал на C, прежде чем я мог использовать переменные в файле .h из других .h файлов без #include "myfile.h". Я пытаюсь сделать то же самое в C++, и я продолжаю получать «определение из-за ошибки области».Файлы заголовков C++ простой вопрос
ответ
Не напрямую. Однако, если файл .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 после этого).
Но я не думаю, что это полностью отвечает на ваш вопрос, потому что этот процесс сам по себе не должен приводить к ошибкам «определения вне сферы действия». Учтите, чтобы опубликовать образец кода, который имеет проблему?
Немного? '# include' является * точно * копированием и вставкой, вплоть до того, есть ли завершающая строка новой строки в последней строке включенного файла. – 2009-11-17 00:23:55
@R. Пат: Да, но он также делает такие вещи, как добавление в директивы #line, поэтому компилятор знает файл и строку, на которой он должен быть включен. Но я согласен с тем, что важно подчеркнуть часть копии и вставки. Я отредактирую. – quark
@ R.Pate: смешно, что вы должны использовать этот пример. В C++ поведение программы не определено, если какой-либо непустой исходный файл не имеет завершающей новой строки (2.1/1/2). Определение «исходного файла» охватывает то, что обычно называют «заголовочными файлами». Таким образом, это тот аспект, в котором он не обязательно эквивалентен копированию и вставке. Я предполагаю, что все или почти все препроцессоры реализуют его таким образом. GCC предупреждает о отсутствии новой строки. –
Переменные в файле .h являются опасной ситуацией, потому что когда вы заголовок заголовок, он просто вставлен в исходный файл. Поэтому, если у вас есть int j;
в файле заголовка и включать его из других исходных файлов, вы в основном определили несколько разных переменных, называемых j
, что, конечно же, является ошибкой.
Нет, ни на C, ни на C++. Часто бывает, что заголовки включаются косвенно, что может произойти в вашем предыдущем опыте.
В C и C++ ничего не видно, если оно не загружено в скомпилированный блок (обычно .c или .cpp-файл), или если он явно объявлен.
Вы можете переадресовать объявить переменную с «Экстерн»
extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here
компиляторов C Older может быть более мягким на необходимости вперед объявляющего.
- 1. Файлы заголовков в C
- 2. Включая файлы заголовков C++
- 3. Включая файлы заголовков в C
- 4. Файлы заголовков Xcode
- 5. простой вопрос на C
- 6. C# полиморфизм простой вопрос
- 7. Простой C голец вопрос
- 8. C# простой отладочный вопрос
- 9. C++ указатели простой вопрос
- 10. Простой вопрос C относительно *
- 11. Простой вопрос о файле (C)
- 12. loadlibrary и файлы заголовков C++
- 13. Файлы заголовков C++ без расширения
- 14. Файлы заголовков C++ не найдены
- 15. Как создать файлы заголовков C
- 16. Обратные файлы заголовков/ссылки
- 17. Основные stucture проекта C/C++ (файлы заголовков и CPP файлы)
- 18. Objective-C простой математический вопрос
- 19. C++ нелегальной цифры, простой вопрос
- 20. Простой вопрос: Размышления в C#
- 21. очень простой объектив-c вопрос
- 22. Objective-C вопрос простой памяти
- 23. iphone/Objective C (простой) вопрос
- 24. Простой вопрос о языке C#
- 25. Простой вопрос LINQ в C#
- 26. очень простой вопрос C++ oop
- 27. C# IndexOutOfRange вопрос, возможно, простой
- 28. Где хранятся файлы заголовков C в Linux
- 29. Файлы заголовков C++ периодически не найдены
- 30. Почему файлы заголовков обеспечивают модульность C-программ?
Вы можете обновить переменные, необходимые как 'extern', чтобы предотвратить эту ошибку, но я не думаю, что это ваш – Earlz
Читайте это: http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko