Указатель функций без типов аргументов?

Я пытался объявить указатель функции, указывающий на любую функцию, возвращающую тот же тип. Я пропустил типы аргументов в объявлении указателя, чтобы узнать, какая ошибка будет сгенерирована. Но программа была скомпилирована успешно и выполнена без каких-либо проблем.

Является ли это правильной декларацией? Не следует ли указывать типы аргументов?

#include  #include  void add(int a, int b) { printf("a + b = %d", a + b); } void (*pointer)() = &add; int main() { add(5, 5); return 0; } 

Выход:

 a + b = 10 

Пустые круглые скобки в имени типа означают неопределенные аргументы. Обратите внимание, что это устаревшая функция.

C11 (ISO / IEC 9899: 201x) §6.11.6 Объявление функций

Использование деклараторов функций с пустыми круглыми скобками (не деклараторами типа параметров прототипа) является устаревшей функцией.

void (*pointer)() указывает, что функция point имеет неопределенное количество аргументов. Он не похож на void (*pointer)(void) . Поэтому позже, когда вы использовали два аргумента, которые успешно подходят в соответствии с определением.

Здесь вы должны знать пару вещей …

Объявление функции:

 int myFunction(); 

Прототип функции:

 int myFunction(int a, float b); 
  • prototype является специальный вид декларации, который описывает количество и типы параметров функции.
  • Объявление non-prototype функции ничего не говорит о его параметре.

Пример:

 int myFunction(); 

Это non-prototype объявление функции не означает, что myFunction принимает аргументов. Это означает, что myFunction принимает неопределенное количество аргументов. Компилятор просто отключает проверку типа аргумента, количество проверок и преобразования аргументов для myFunction .

Таким образом, вы можете сделать,

 int myFunction(); // The non-prototype signature will match a definition for // myFunction with any parameter list. // This is the function definition... int myFunction(int x, float b, double d) { ... }