Функция 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)
вместо ()
,