Любая документация для вызова функции без прототипа в C? - PullRequest
0 голосов
/ 08 марта 2011

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

Например, приведенный ниже исходный файл может быть скомпилирован без проблем в VC ++ 2010.

// NoPrototype.c
// Compile it as cl.exe /c NoPrototype.c
int main()
{
  FakeFunction(1, 2, 3); // No definition for this function in this compilation unit.
}

Ответы [ 2 ]

1 голос
/ 08 марта 2011

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

Это причина, по которой функции типа toupper имеют значение int toupper(int c);, а не char. Изначально он использовался без прототипа, и этот неявный интерфейс застрял!

1 голос
/ 08 марта 2011

Отсутствует объявление в области видимости UB.

J.2 Неопределенное поведение

- Для вызова функции без прототипа функции в области, где функция определяется прототипом функции, либо прототип заканчивается многоточием, либо типы аргументов после продвижения не совместимы с типами параметров 6.5.2.2).

Comeau отклоняет ваш код

"ComeauTest.c", line 5: error: identifier "FakeFunction" is undefined
    FakeFunction(1, 2, 3); // No definition for this function in this compilation unit.
    ^

1 error detected in the compilation of "ComeauTest.c"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...