Почему компилятор предполагает, что malloc возвращает int? - PullRequest
3 голосов
/ 10 июля 2009

Я знаю, что в C лучше никогда не приводить возвращаемое значение malloc(). Я читал, что компилятор предполагает, что malloc() возвращает int, если вы не включите stdlib.h. Конечно, это приведет к ошибке, если вы попытаетесь неявно присвоить int чему-то, что не является int, но эта ошибка может быть скрыта явным приведением - отсюда опасность явного приведения malloc().

Для любой созданной мной функции, если функция не существует, компилятор скажет мне об этом. Почему компилятор предполагает, что malloc() возвращает int, даже если вы не включили stdlib.h? Разве malloc() не должен оставаться неопределенным, пока вы не включите stdlib.h?

Ответы [ 4 ]

7 голосов
/ 10 июля 2009

На самом деле, если компилятор не видел объявления для какой-либо функции, которую вы вызываете (не только для malloc), он предположит, что это extern и вернет int. Большинство используемых мной компиляторов выдают только предупреждение, а не ошибку, если вы не включите уровень предупреждения.

Это восходит к ранним временам C, я не думаю, что это разрешено в C99.

@ Комментарий Майкла: Вы, кажется, правы, согласно K & R (стр. 72):

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

1 голос
/ 10 июля 2009

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

0 голосов
/ 10 июля 2009

Предполагается, что все функции возвращают int по умолчанию, если не указано иное.

См. здесь .

0 голосов
/ 10 июля 2009

Это значение по умолчанию для каждой функции.

Мой компилятор говорит мне, что если я не определил функцию, int testFunction() не определено.

...