Нет определенного типа параметра функции по умолчанию int? Я сумасшедший?

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

#include <stdio.h>

char toChar(n) {
  //sizeof n is 4 on my 32 bit system
  const char *alpha = "0123456789ABCDEF";
  return alpha[n];
}

int main() {
  putchar(toChar(15)); //i.e.
  return 0;
}

Я уверен, что main по умолчанию использует int по умолчанию для большинства компиляторов какого-то стандарта (но только с возвратом), это поведение также верно для других функций или эта реализация определена? Кажется, это просто необычно, мой компилятор - просто немного устаревший порт GCC (MinGW).

3 ответа

Решение

Объявление функции в стиле K&R:

void foo(n) 
    int n; 
{

}

Если тип не указан, по умолчанию используется int. Это действительно в C89, а не в C99

@ Ответ Эрика верен, но (IMO) может быть неправильно истолкован.

У вас есть определение стиля K&R, это полностью верно. поскольку int считается типом по умолчанию, если у вас есть что-то вроде: foo(n) { }, это означает тип возвращаемого значения и тип n оба int по умолчанию.

C99 (в основном) удаляет правило "int по умолчанию", но не полностью удаляет определения стиля K&R. Это означает, что приведенное выше определение больше не допускается; определить foo с теми же типами, что и выше, вы все равно можете использовать:

int foo(n)
int n;
{
}

Т.е. определение стиля K&R все еще разрешено, но вам нужно указать тип возвращаемого значения и тип параметра, даже если тип int.

Этот стиль определения функции, однако, устарел (согласно §6.11.7). Это действительно только разрешено ради древнего (предварительно стандартного) кода. Вы не хотите писать новый код таким способом, хотя технически это все еще разрешено. Для нового кода вы явно хотите использовать определение в стиле прототипа:

int foo(int n) {}

Для тех, кто заботится о таких вещах, определение стиля K&R все еще используется в каком-то новом коде. Его более короткий стиль может быть полезен (используя термин свободно) в код-гольфе.

Пока мы на этом: ответ @ stijn тоже вроде правильный. В частности, когда функция определяется таким образом (т. Е. Стиль K&R), все аргументы подлежат продвижению по умолчанию. Это означает, что если вы передадите целочисленный тип меньше, чем int, он будет повышен до int перед тем, как пройти, и если вы передадите float, он будет повышен до double,

afaik это называется аргументом продвижения. я не помню точных правил, но все сводится к тому, что компилятору разрешено использовать int для аргументов, когда он (она?) еще не знает прототип функции.

Другие вопросы по тегам