Возможно, основанный глубже на VLA, отладчиках, _Geneirc_
, некоторых предлагаемых в настоящее время особенностях следующего C или некотором другом углу C, вопрос:
Есть ли преимущество кодирования (объективная причина), которое предпочитает одну сигнатуру функции другой, когда задействованы указатели на функции?
Я не нашел ни одного.
Как правило, порядок аргументов в сигнатуре функции - это просто выбор стиля. Однако я ищу причину, по которой в функции, отличной от (...)
с аргументом указателя функции, может существовать преимущество для определенного порядка.
Я мог бы определить функцию, содержащую указатель функции, как
// Function pointer before its arguments a1,b1 it will eventually use
void foo1(void (*fun)(int a0, double b0), int a1, double b1) {
fun(a1, b1);
fun(a1,-b1);
}
или
// Function pointer after the a2,b2 arguments
void foo2(int a2, double b2, void (*fun)(int a0, double b0)) {
fun(a2, b2);
fun(a2, -b2);
}
Исследование стандартной библиотеки C предлагает 2 противоположных примера.
// Function pointer before `context`.
errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
int (*compar)(const void *x, const void *y, void *context), void *context);
// Function pointer last.
void (*signal(int sig, void (*func)(int)))(int);
Пока что это, безусловно, выбор стиля.
Порядок важен с VLA
Я рассмотрел VLA s, где нужны аргументы перед arr2
и каким-то образом может подпись fun2()
основываться на row2, col2, arr2
и получить некоторую выгоду. Это дало бы преимущество для указателя функции на след.
int foo2(int row2, int col2, char arr2[row2][col2], void (*fun2)(TBD_Signature);
Но я не нашел полезного примера.
[Редактировать] Возможно, другой способ взглянуть на один аспект из этого вопроса:
Может ли подпись указателя функции быть полезной из предыдущих аргументов функции?
int bar(int some_arg, other_args,
(*f)(signature based on some_arg, other_args or their type));