Я пытался объявить указатель функции, указывающий на любую функцию, возвращающую тот же тип. Я пропустил типы аргументов в объявлении указателя, чтобы узнать, какая ошибка будет сгенерирована. Но программа была скомпилирована успешно и выполнена без каких-либо проблем.
Является ли это правильной декларацией? Не следует ли указывать типы аргументов?
#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) { ... }