Возвращает указатель на функцию без определения типа

#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 имеет статический квалификатор.