#c
#c
Вопрос:
Я пытаюсь написать функцию, которая возвращает указатель на функцию без использования каких-либо определений типа. Возвращаемая функция должна быть назначаемой для
static int (*compare_function)(int a);
Это лучший / единственный способ сделать это?
static static int (*compare_function)(int a)
assign_compare_function(int a,...,char* z){
//blah
}
Есть две статики, потому что я хочу, чтобы функция присваивателя также была статической.
Комментарии:
1. Сработает ли это? Попробуйте и расскажите нам..
2. @EugeneSh. Извините 🙂 я имел в виду, это правильный / идиоматический способ сделать это?
3. Почему бы не использовать
typedef
? Если это часть интерфейса, правильным способом было бы использовать его.4. Единственная причина, по которой я могу придумать, чтобы избежать
typedef
, заключается в том, что это академическое упражнение, которое предъявляет такое требование.5. cdecl может помочь вам разобраться в значениях объявлений C. Ваш компилятор может помочь вам подтвердить ваш ответ.
Ответ №1:
Первая проблема, связанная с вашим определением, заключается в том, что писать его бессмысленно static static
. Это потому, что static
это спецификатор хранилища, и он не является частью типа как такового. Вторая проблема заключается в том, что вам нужен список параметров для обеих функций.
Вы можете написать это:
int (*compare_function(void))(int a) {
...
}
Или вы можете сделать compare_function
статический:
static int (*compare_function(void))(int a) {
...
}
Любой из них вернет объект типа int (*)(int a)
, который вам нужен. Чтобы уточнить, без использования typedef
, это единственный способ написать функцию, которая возвращает функцию (не считая некоторых
Запись static static
не имеет смысла. Представьте, что вы пишете что-то вроде:
// no
typedef static int SInt;
Это тоже просто не имеет никакого смысла, поэтому, когда у вас есть переменная:
static int (*compare_function)(int a);
Тип является int (*)(int)
, длительность хранения является статической, а связь является внутренней.
Комментарии:
1. Вы совершенно правы, но, похоже, вы упустили суть вопроса, которая заключается в том, как написать сигнатуру для функции, тип возвращаемого значения которой соответствует типу указателя на функцию.
2. @JohnBollinger: «Вы можете писать
int (*compare_function)(int a)
» не распространяется на это? Я в замешательстве, почему вы думаете, что это не отвечает на вопрос.3. Поправьте меня, если я ошибаюсь @DietrichEpp — но вы, по сути, подтверждаете, что его первая строка кода, возможно, является «лучшим» или наиболее «идиоматичным» способом возврата указателя на функцию без
typedef
?4. Нет, ваш ответ не отвечает на вопрос. Учитывая переменную,
compare_function
объявленную так, как вы представили в конце вашего ответа, вопрос заключается не в том, как объявить функцию, на которую может указывать эта переменная, а в том, как объявить функцию, возвращаемое значение которой может быть присвоено этой переменной.5. @JohnBollinger: Извините, опечатка, исправлена.
Ответ №2:
Вот способ корректного возврата указателя на функцию:
int compare_function(int a);
int (*assign_compare_function())(int)
{
return compare_function;
}
Ответ №3:
Ключевое слово static является определителем области видимости. Это не является частью самого типа.
int (*compare_function)(int a);
Это определяет функцию, принимающую значение int ‘a’, возвращающее значение int. Вы можете использовать compare_function после этого оператора, чтобы ссылаться на тип с сигнатурой этой функции.
Вы могли бы назначить его:
static int my_compare_function(int a)
{
return a - 10; // stupid implementation
}
compare_function = my_compare_function;
Обратите внимание, что my_compare_function имеет статический квалификатор.