Обратите внимание, что когда вы говорите:
bool (*a)();
вы объявляете a
типа «указатель на функцию, возвращающую bool
и принимающую неопределенное количество параметров». Предполагая, что bool
определено (возможно, вы используете C99 и включили stdbool.h
, или это может быть typedef), это может или не может быть тем, что вы хотите.
Проблема здесь в том, что компилятор не может проверить, присвоено ли a
правильное значение. Та же проблема существует с вашими объявлениями функций. A()
, B()
и C()
все объявлены как функции «возвращающие bool
и принимающие неопределенное количество параметров».
Чтобы увидеть, какие проблемы могут возникнуть, давайте напишем программу:
#include <stdio.h>
int test_zero(void)
{
return 42;
}
static int test_one(char *data)
{
return printf("%s\n", data);
}
int main(void)
{
/* a is of type "pointer to function returning int
and taking unspecified number of parameters */
int (*a)();
/* b is of type "pointer to function returning int
and taking no parameters */
int (*b)(void);
/* This is OK */
a = test_zero;
printf("a: %d\n", a());
a = test_one; /* OK, since compiler doesn't check the parameters */
printf("a: %d\n", a()); /* oops, wrong number of args */
/* This is OK too */
b = test_zero;
printf("b: %d\n", b());
/* The compiler now does type checking, and sees that the
assignment is wrong, so it can warn us */
b = test_one;
printf("b: %d\n", b()); /* Wrong again */
return 0;
}
Когда я компилирую вышеизложенное с помощью gcc, он говорит:
предупреждение: присвоение из несовместимого типа указателя
для строки b = test_one;
, что хорошо. Нет предупреждения для соответствующего присвоения a
.
Итак, вы должны объявить свои функции как:
bool A(void);
bool B(void);
bool C(void);
И тогда переменная для хранения функции должна быть объявлена как:
bool (*choice)(void);