назначение указателя функции - PullRequest
2 голосов
/ 04 декабря 2011

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

Например, когда я делаю:

int f()
{ return 0;}

int (*ptr)(int) = f;

компилятор не выдает никаких предупреждений

Ответы [ 2 ]

5 голосов
/ 04 декабря 2011

В C f не принимает «никаких аргументов», а скорее «любые аргументы» *. Скажите int f(void), чтобы объявить "без аргументов".

Это отличается от C ++. В частности, C имеет отдельные понятия функции «объявление» и функции «прототип»:

int f();              /* declaration -- f is still a mystery */
int f(int, double);   /* prototype -- now we know how to call f */
int f(int n, double c) { return -1; }  /* defintion -- now we can link */

*) Как я уже говорил в комментарии, «любые аргументы» ограничены типами, которые не подвергаются продвижению по умолчанию (так же, как продвижение по умолчанию происходит с переменными аргументами). То есть float, все разновидности char и short int, а также ..., не допустимы в фактической сигнатуре функции.

0 голосов
/ 04 декабря 2011

Какой компилятор вы используете?

  • MinGW-GCC-3.4.2: invalid conversion from int (*) () 'до int (*)(int)'
  • Visual Studio 2010 Pro: Error 1 error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(void)' to 'int (__cdecl *)(int)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...