что делает компилятор переменного тока, когда не находит соответствующую функцию - PullRequest
4 голосов
/ 29 сентября 2011

Рассмотрим следующий код:

#include<stdio.h>
int f()
{
        printf(" hey ");
        return 5;
}
int main()
{
        printf("hello there %d",f(4,5));
        f(4,5);
        return 0;
}

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

Ответы [ 2 ]

8 голосов
/ 29 сентября 2011

C в некоторых отношениях намного менее строг, чем C ++.

Подпись функции f() в C ++ означает функцию без аргументов, и соответствующий компилятор должен обеспечить это. В С, напротив, поведение не определено, и компиляторы не обязаны диагностировать, если функция вызывается с аргументами, даже если она была определена без параметров. На практике современные компиляторы должны как минимум предупреждать о недопустимом использовании.

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

Чтобы предотвратить это, используйте следующий прототип ISO / IEC 9899 6.7.6.3/10:

int f(void)
2 голосов
/ 29 сентября 2011

В дополнение к тому, что написал Конрад, C также неявно объявляет функции для вас.Например:

int main(int argc, char** argv)
{
  int* p = malloc(sizeof(int));
  return 0;
}

скомпилируется (возможно, с предупреждением) без #include <stdlib.h>, содержащего объявление.

...