2013-09-07 2 views
1

Нужен ли мне заголовочный файл для использования библиотек? Мой код работает без файлов заголовков, а библиотеки связаны отлично, за исключением того, что я получаю сообщение «предупреждение: неявное объявление функции» .После его простого предупреждения моя программа работает.Файлы и библиотеки заголовков

+1

Вам нравятся ошибки в ваших программах? Или вы такой хороший программист, что никогда не совершаете ошибку или неправильно используете функцию? Вы получаете предупреждения о 'printf()' не объявлены? Вы вызываете неопределенное поведение, если не объявляете его должным образом? Если бы вы были таким хорошим программистом, вы бы не задавали вопрос, поэтому ответ: «Да, вам нужны заголовки, потому что вы смертный, как и все мы». Кроме того, C99 требует, чтобы функции были объявлены до их использования, поэтому ваш код может быть совместим только с древним стандартом C89, а не с C99 (старый стандарт) C11 (текущий стандарт). –

+1

Никогда не говорите «просто предупреждение» - предупреждение, которое вы выберете для игнорирования, может привести к ошибке, требующей нескольких часов, чтобы найти ее позже. –

+0

@JonathanLeffler Я думаю, что OP ищет слово «смирение». Мало кто умнее создателей C. –

ответ

1

Header file: - это файл, который позволяет программистам отделить определенные элементы исходного кода программы от файлов многократного использования.

Файл библиотеки - это исполняемый код, который работает в соответствии с тем, что указано в файле заголовка.

Я получаю сообщение «предупреждение: неявное объявление функции».

Может быть много причин для этого предупреждения, например, может быть, ваш защитник заголовка работает неправильно. Другая возможность заключается в том, что вы объявили функцию Func, но вызвали ее с помощью func.

Проверить this из: -

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

1

Для большинства стартеров это предупреждение видно, когда они начинают использовать

malloc 

Так я использую этот пример. Для предупреждения в этом случае вам нужно добавить:

#include <stdlib.h> 

Этот файл содержит декларацию для встроенной функции malloc. Если вы не сделаете этого, компилятор считает, что вы хотите, чтобы определить свои собственные функции с именем malloc и предупреждает вас, потому что:

  1. Вы явно не объявить его и
  2. Там уже есть встроенный В этой функции, которая имеет другую подпись, отличную от той, которая была объявлена ​​неявно (когда функция объявлена ​​неявно, предполагается, что ее типы возврата и аргументов являются int, что несовместимо со встроенным malloc, которое принимает size_t и возвращает void*).
1

Мой код работает без заголовочных файлов и библиотек связаны отлично, за исключением, что я получаю «предупреждение: неявная декларация функции» message.Still его просто предупреждение моя программа работает.

Плохая практика игнорировать предупреждение от компилятора. Программы, которые не скомпилированы должным образом, могут иметь ошибки, которые могут вызвать большие проблемы и ошибки в будущем.

Так, например, если вы получите предупреждение:

prog.c:12:5: warning: implicit declaration of /*some function used in the program*/ 

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

1

Действительно ли мне нужны файлы заголовков для использования библиотек?

Да.

Мой код работает без заголовочных файлов

Нет, это не так. Кажется, он работает.

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

В этом случае, я бы не назвал его «идеальным».

По-прежнему его предупреждает моя программа.

И вы никогда не узнаете, что он делает с , теперь он вызывает неопределенное поведение. «Просто предупреждение»? Конечно. Есть причина, по которой компилятор предупреждает вас. Соблюдайте предупреждения и исправьте их.

Вот цитата из C99 (6.5.2.2.6), который объясняет, почему программа имеет UB без заголовков (более точно, без соответствующих функциональных прототипов, которые вы, кажется, не имеют ни):

  1. Если выражение, обозначающее вызываемую функцию, имеет тип, который не содержит прототип, то для каждого аргумента выполняются целые акции, а аргументы с типом float повышаются до двух. Они называются рекламными акциями по умолчанию. Если количество аргументов не равно числу параметров, поведение не определено.

Если функция определена с типом, который включает в себя прототип, а также прототип заканчивается многоточием (...) или типы аргументов после повышения не совместимы с типы параметров, поведение не определено.

Если функция определяется с типом, который не включает в себя прототип, и типы аргументов после продвижения не совместимы с параметрами после продвижения, поведение не определено, за исключением в следующих случаях:

- один продвинутый тип представляет собой целочисленный тип со знаком, другой продвинутый тип - это нулевой целочисленный тип , и это значение представляется в обоих типах;

- оба типа являются указателями на квалифицированные или неквалифицированные версии символьного типа или void.

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

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