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

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

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

Но код компилируется и запускает функциональный тест рекурсивно.

static void test1(int a, int b, int c) { }

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

void main() {
  test();
}

2 ответа

Решение

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

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

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

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

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