Нужен ли мне заголовочный файл для использования библиотек? Мой код работает без файлов заголовков, а библиотеки связаны отлично, за исключением того, что я получаю сообщение «предупреждение: неявное объявление функции» .После его простого предупреждения моя программа работает.Файлы и библиотеки заголовков
ответ
Header file: - это файл, который позволяет программистам отделить определенные элементы исходного кода программы от файлов многократного использования.
Файл библиотеки - это исполняемый код, который работает в соответствии с тем, что указано в файле заголовка.
Я получаю сообщение «предупреждение: неявное объявление функции».
Может быть много причин для этого предупреждения, например, может быть, ваш защитник заголовка работает неправильно. Другая возможность заключается в том, что вы объявили функцию Func
, но вызвали ее с помощью func
.
Проверить this из: -
В том числе файл заголовка равно скопировать содержимое файла заголовка , но мы этого не делаем, потому что это будет очень подвержен ошибкам и не хорошая идея скопировать содержимое заголовочного файла в файлы источника , особенно если у нас есть несколько исходных файлов, содержащих нашу программу .
Для большинства стартеров это предупреждение видно, когда они начинают использовать
malloc
Так я использую этот пример. Для предупреждения в этом случае вам нужно добавить:
#include <stdlib.h>
Этот файл содержит декларацию для встроенной функции malloc
. Если вы не сделаете этого, компилятор считает, что вы хотите, чтобы определить свои собственные функции с именем malloc
и предупреждает вас, потому что:
- Вы явно не объявить его и
- Там уже есть встроенный В этой функции, которая имеет другую подпись, отличную от той, которая была объявлена неявно (когда функция объявлена неявно, предполагается, что ее типы возврата и аргументов являются
int
, что несовместимо со встроеннымmalloc
, которое принимаетsize_t
и возвращаетvoid*
).
Мой код работает без заголовочных файлов и библиотек связаны отлично, за исключением, что я получаю «предупреждение: неявная декларация функции» message.Still его просто предупреждение моя программа работает.
Плохая практика игнорировать предупреждение от компилятора. Программы, которые не скомпилированы должным образом, могут иметь ошибки, которые могут вызвать большие проблемы и ошибки в будущем.
Так, например, если вы получите предупреждение:
prog.c:12:5: warning: implicit declaration of /*some function used in the program*/
Ожидается, что вы должны включить заголовочный файл, в котором эта функция определена.
Действительно ли мне нужны файлы заголовков для использования библиотек?
Да.
Мой код работает без заголовочных файлов
Нет, это не так. Кажется, он работает.
и библиотеки связаны отлично, за исключением, что я получаю «предупреждение: неявная декларация функции» сообщение
В этом случае, я бы не назвал его «идеальным».
По-прежнему его предупреждает моя программа.
И вы никогда не узнаете, что он делает с , теперь он вызывает неопределенное поведение. «Просто предупреждение»? Конечно. Есть причина, по которой компилятор предупреждает вас. Соблюдайте предупреждения и исправьте их.
Вот цитата из C99 (6.5.2.2.6), который объясняет, почему программа имеет UB без заголовков (более точно, без соответствующих функциональных прототипов, которые вы, кажется, не имеют ни):
- Если выражение, обозначающее вызываемую функцию, имеет тип, который не содержит прототип, то для каждого аргумента выполняются целые акции, а аргументы с типом float повышаются до двух. Они называются рекламными акциями по умолчанию. Если количество аргументов не равно числу параметров, поведение не определено.
Если функция определена с типом, который включает в себя прототип, а также прототип заканчивается многоточием (...) или типы аргументов после повышения не совместимы с типы параметров, поведение не определено.
Если функция определяется с типом, который не включает в себя прототип, и типы аргументов после продвижения не совместимы с параметрами после продвижения, поведение не определено, за исключением в следующих случаях:
- один продвинутый тип представляет собой целочисленный тип со знаком, другой продвинутый тип - это нулевой целочисленный тип , и это значение представляется в обоих типах;
- оба типа являются указателями на квалифицированные или неквалифицированные версии символьного типа или void.
Существует очень хорошая причина, когда используются файлы заголовка. Люди, которые изобрели и разработали язык, знали, что они делают, и они приняли это решение, потому что это необходимая вещь и хорошее решение проблемы, которая должна быть видна во всех единицах компиляции.
- 1. Пользовательские файлы заголовков и включают библиотеки [C++]
- 2. У библиотеки обычно есть файлы заголовков?
- 3. Как обрабатывать файлы cpp и файлы заголовков
- 4. заголовков и CPP файлы
- 5. «Виртуальный» и файлы заголовков
- 6. CMake конфликтующие файлы заголовков
- 7. Файлы заголовков Xcode
- 8. Где находятся библиотека пакетов и файлы заголовков
- 9. loadlibrary и файлы заголовков C++
- 10. Пространства имен и файлы заголовков
- 11. Стандартная иерархия заголовков библиотеки
- 12. Объединение файлов заголовков для библиотеки
- 13. Android JNI не находит файлы заголовков стандартной библиотеки C++
- 14. Включая файлы заголовков из библиотек при создании новой библиотеки
- 15. Включить файлы заголовков из статической библиотеки с CMake
- 16. Файлы заголовков не найдены GCC
- 17. Обратные файлы заголовков/ссылки
- 18. Libdvbcsa, отсутствующие файлы заголовков
- 19. импортировать файлы заголовков
- 20. Загрузка Файлы заголовков
- 21. файлы заголовков Mystery
- 22. Файлы заголовков в C
- 23. Файлы заголовков Cygwin
- 24. Как использовать файлы заголовков?
- 25. Различные файлы заголовков Wordpress
- 26. Как организовать файлы заголовков
- 27. Файлы заголовков Структура
- 28. YouCompleteMe, файлы заголовков
- 29. Файлы вскрытых заголовков
- 30. WampServer, файлы заголовка и библиотеки клиента
Вам нравятся ошибки в ваших программах? Или вы такой хороший программист, что никогда не совершаете ошибку или неправильно используете функцию? Вы получаете предупреждения о 'printf()' не объявлены? Вы вызываете неопределенное поведение, если не объявляете его должным образом? Если бы вы были таким хорошим программистом, вы бы не задавали вопрос, поэтому ответ: «Да, вам нужны заголовки, потому что вы смертный, как и все мы». Кроме того, C99 требует, чтобы функции были объявлены до их использования, поэтому ваш код может быть совместим только с древним стандартом C89, а не с C99 (старый стандарт) C11 (текущий стандарт). –
Никогда не говорите «просто предупреждение» - предупреждение, которое вы выберете для игнорирования, может привести к ошибке, требующей нескольких часов, чтобы найти ее позже. –
@JonathanLeffler Я думаю, что OP ищет слово «смирение». Мало кто умнее создателей C. –