Подтвердить что ты не робот

Функция C без поведения параметров

Может кто-нибудь объяснить мне, почему следующий код компилируется без предупреждения или ошибки?

Я ожидаю, что компилятор предупредит меня, что функция no_args не ожидает никаких аргументов.

Но код компилирует и запускает функцию no_args рекурсивно.

static void has_args(int a, int b, int c) { 
    printf("has_args\n");
}

static void no_args() {
    printf("no_args\n");
    no_args(1, 2, 3);
}

void main() {
  no_args();
}
4b9b3361

Ответ 1

В C++ void no_args() объявляет функцию, которая не принимает параметров (и ничего не возвращает).

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

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

Ответ 2

Когда вы объявляете функцию с пустым списком аргументов, вы вызываете семантику K & R (pre-prototype), и ничего не предполагается о списке параметров; это так, что код до ANSI C все еще будет компилироваться. Если вы хотите прототипированную функцию с пустым списком параметров, используйте (void) вместо ().