2016-10-21 2 views
1

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

static int (*compare_function)(int a); 

Это лучший/единственный способ сделать это?

static static int (*compare_function)(int a) 
assign_compare_function(int a,...,char* z){ 
//blah 
} 

Есть две статики, потому что я хочу, чтобы функция назначения также была статичной.

+0

Будет ли это работать? Попробуйте и сообщите нам .. –

+0

@EugeneSh. Извините, что я имел в виду, это правильный/идиоматический способ сделать это? –

+2

Почему бы не использовать 'typedef'? Если это часть интерфейса, правильным способом было бы использовать его. –

ответ

3

Первая проблема с вашим определением заключается в том, что писать static static не имеет смысла. Это связано с тем, что static является классификатором и не является частью этого типа. Вторая проблема заключается в том, что вам нужен список параметров для обеих функций.

Вы можете написать это:

int (*compare_function(void))(int a) { 
    ... 
} 

Или вы можете сделать compare_function статические:

static int (*compare_function(void))(int a) { 
    ... 
} 

Любой из них будет возвращать объект типа int (*)(int a) который является то, что вы хотите. Чтобы уточнить, без использования typedef, это единственный способ, чтобы написать функцию, которая возвращает функцию (не считая someo

Запись static static не имеет смысла Представьте себе писать что-то вроде:.

// no 
typedef static int SInt; 

Это просто Безразлично» т имеет никакого смысла, либо, поэтому, когда у вас есть переменная:.

static int (*compare_function)(int a); 

Тип является int (*)(int), а длительность хранения статична, а связь является внутренним

+1

Вы совершенно правы, но, похоже, вы пропустили точку вопроса, а именно, как написать подпись для функции, тип возврата которой - это тип указателя функции. –

+0

@JohnBollinger: «Вы можете написать« int (* compare_function) (int a) '», чтобы не покрыть это? Я смущен, почему вы думаете, что не отвечает на вопрос. –

+0

Исправьте меня, если я ошибаюсь @DietrichEpp, но вы по существу подтверждаете, что его первая строка кода, пожалуй, является «лучшим» или «идиоматическим» способом возврата указателя функции w/out 'typedef'? –

1

Вот как правильно возвращать указатель функции:

int compare_function(int a); 

int (*assign_compare_function())(int) 
{ 
    return compare_function; 
} 
0

Ключевое слово статическими является сфера отборочные. Он не является частью самого типа.

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

Смежные вопросы