Функция 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();
}
Ответы
Ответ 1
В C++ void no_args()
объявляет функцию, которая не принимает параметров (и ничего не возвращает).
В Си void no_args()
объявляет функцию, которая принимает неопределенное (но не переменное) количество параметров (и ничего не возвращает). Таким образом, все ваши звонки действительны (в соответствии с прототипом) в C.
В C используйте void no_args(void)
, чтобы объявить функцию, которая действительно не принимает параметров (и ничего не возвращает).
Ответ 2
Когда вы объявляете функцию с пустым списком аргументов, вы вызываете семантику K & R (pre-prototype), и ничего не предполагается о списке параметров; это так, что код до ANSI C все еще будет компилироваться. Если вы хотите прототипированную функцию с пустым списком параметров, используйте (void)
вместо ()
.