Связывать объектные файлы, заставляя включать лишние? - PullRequest
2 голосов
/ 01 ноября 2010

Я пробую свои силы на немного C. И я подумал, что понял это связующее дело.Но я думаю, нет.У меня есть простой файл main.c:

#include "function.h"
int main(char args[])
{
    int print = myfunction();
}

, затем вторая пара файлов function.c / function.h

int myfunction(); //function.h

int myfunction()  //function.c
{
    return 5;
}

, компилирующая это прекрасно работает.Тем не менее, он прекрасно работает независимо от того, использую я #include "function.h" в моем основном файле или нет.Зачем мне тогда включать function.h?

Ответы [ 5 ]

3 голосов
/ 01 ноября 2010

Я не знаю, в какой системе вы находитесь, но если она использует gcc или что-то совместимое, попробуйте еще раз с

cc -Wall -Werror *.c

Или включите эквивалентные опции для вашей системы.

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

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

2 голосов
/ 01 ноября 2010

Компилятор переменного тока не требует , что вы указываете прототип для функции 1 перед его использованием.Прототип просто позволяет компилятору проверить, что тип (ы) параметров, которые вы передаете, соответствуют типу (ам), который требуется для функции, - и неявным образом преобразовать в правильный тип, если он неправильный, и существует неявное преобразование.от / к задействованным типам.

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

1 За исключением функции с переменным числом, и даже там "переменная"параметры по-прежнему в основном подчиняются тем же правилам, как если бы не было прототипа для функции.

1 голос
/ 01 ноября 2010

Когда вы используете функцию, которая не была определена, многие компиляторы C просто предполагают, что это extern-функция, возвращающая int (вы часто получаете предупреждение, но код компилируется.) Вы столкнетесь с проблемами, когда выначните использовать функции с более сложными аргументами и возвращаемыми типами.

0 голосов
/ 01 ноября 2010

Если вы используете функцию, которая не была объявлена, более старые компиляторы C предполагают, что она имеет аргументы ... и тип возвращаемого значения int. Это не рекомендуется. Если вы включите предупреждения компилятора, вы, скорее всего, получите предупреждение об использовании необъявленной функции. Компилятор может поймать больше ошибок, если он видит function.h перед компиляцией main.c, поэтому он точно знает, как myfunction должен действовать.

0 голосов
/ 01 ноября 2010

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

В вашем простом примере это не требуется.

...