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

Почему я могу вызвать функцию через указатель со слишком большим количеством аргументов?

Скажем, у меня есть эта функция:

int func2() {
    printf("func2\n");
    return 0;
}

Теперь я объявляю указатель:

int (*fp)(double);

Это должно указывать на функцию, которая принимает аргумент double и возвращает int.

func2 НЕ имеет никакого аргумента, но все же, когда я пишу:

fp = func2;
fp(2);

2 является просто произвольным числом), func2` вызывается правильно.

Почему? Нет ли значения для числа параметров, которые я объявляю для указателя функции?

4b9b3361

Ответ 1

Да, есть смысл. В C (но не в С++) функция, объявленная с пустым набором скобок, означает, что она принимает неопределенное количество параметров. Когда вы это делаете, вы запрещаете компилятору проверять количество и типы аргументов; это сохранение до того, как язык C был стандартизован ANSI и ISO.

Невозможность вызвать функцию с правильным числом и типами аргументов приводит к поведению undefined. Если вы явно заявляете, что ваша функция принимает нулевые параметры, используя список параметров void, тогда компилятор выдаст вам предупреждение при назначении указателя функции неправильного типа:

int func1();  // declare function taking unspecified parameters
int func2(void);  // declare function taking zero parameters
...
// No warning, since parameters are potentially compatible; calling will lead
// to undefined behavior
int (*fp1)(double) = func1;
...
// warning: assignment from incompatible pointer type
int (*fp2)(double) = func2;

Ответ 2

Вам нужно явно объявить параметр, иначе вы получите поведение undefined:)

int func2(double x)
{
    printf("func2(%lf)\n", x);
    return 0;
}