2016-01-21 7 views
3

Я знаю, что существуют два типа функций: void и те, которые возвращают что-то (int, double и т. Д.). Но что, если функция объявлена ​​без каких-либо возвратных операторов? Считается ли это функцией void? Например,Функция без какого-либо типа возврата

myFunction(int value){ 
....... 
} 
+4

В «старинные дни», которые по умолчанию будут «int». Не уверен, что это все еще правильная интерпретация ... – John3136

+2

@ John3136 это было верно вплоть до C99. С тех пор он плохо сформировался. –

+0

@ M.M Спасибо. Я подозревал, что это может быть неправильно. У меня возникло соблазн спросить «зачем кому-то все-таки это делать», но это не очень важно! – John3136

ответ

5

функция объявлена ​​без какого-либо типа возврата считается возвращением к int. Это древнее правило, возвращающееся к оригиналу K & R C, оставленному на языке для обратной совместимости.

Целочисленные акции и конверсия float аргументов double s выполняются для функций без предварительного определения или форвардного объявления по той же причине - обратная совместимость с действительно старым кодом.

Нет необходимости говорить, что полагаться на эти правила для новой разработки - очень плохая практика. Всегда следует декларировать тип возврата явно, а forward-declare или определять все функции перед их вызовом.

+0

Неразведанные функции обрабатываются так, как если бы они были объявлены с неуказанным списком параметров ('()')? – Quentin

+0

@Quentin Спасибо! Вы правы, это те же правила, что и с неуказанными списками параметров (int promotion, floats становятся двойниками и т. Д.). – dasblinkenlight

+0

@Quentin в C89, вызов неотделенной функции действовал так, как если бы функция была объявлена ​​'int f();'. Поскольку C99 это правило было удалено, и он плохо сформирован, чтобы вызвать необъявленную функцию. –

0

Во-первых, я должен сказать, что ваш код:

myFunction(int value){ 
....... 
} 

является функцией определение, кроме просто декларации. Чистая декларация будет как:

myFunction(int value); 

или

myFunction(int); //also valid but less recommended due to bad readability 

Также отметим, что каждое определение может служить объявление функции, но не наоборот.

Вернемся к вашему вопросу. myFunction(int value); соответствует int myFunction(int value); в соответствии с более ранними стандартами. Фактически, компиляторы будут считать все необъявленные функции возвратом int, используя эти стандарты.

Однако прототип без типа не является объявлением функции с C99, хотя тип, скорее всего, все еще будет рассматриваться как int компилятором.

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

void myFunction(int value); 

Смотрите также: Are prototypes required for all functions in C89, C90 or C99?

0

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

Например, gcc -std=c11 -pedantic-errors -Wall.

Если у вас есть 20-летний компилятор, такие функции были разрешены. Тогда тип возврата будет по умолчанию равен int, если не указано явно. Аналогично, если прототип функции не был виден, компилятор должен составить декларацию функции бессмысленности, основанную на вызове функции, где тип возврата будет по умолчанию равен int, если прототип не был виден.

Существовал никогда не было никакого обоснования того, почему функция «implicit int» имеет смысл. На практике это было блокирование компилятора из проверки статического типа и, следовательно, создание множества ошибок.

Опасный, «неявный INT» был поэтому незамедлительно удалены из языка C в 1999 году

Это на самом деле одна из главных причин, почему вы не должны использовать C компилятор, который следует какой-нибудь древний вариант язык C в 2016 году.

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