2016-06-29 3 views
4

Для реализации конечного автомата, я хотел бы, чтобы добиться чего-то вроде этого:Funtion указатель на функцию, возвращающую указатель на указанной функции типа

currentFunction = currentFunction(int arg); 

с currentFunction является функцией указатель на функцию, которая возвращает указатель функции того же типа функции.

Возможно ли это в C? Как?

ответ

4

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

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

typedef struct func_wrapper_t 
{ 
    struct func_wrapper_t (*func) (int); 
} func_t; 

... 

func_t some_function (int x) 
{ 
    ... 
    return (func_t){ some_function }; 
} 

... 

int main(void) 
{ 
    func_t f = some_function(0); 

    return 0; 
} 
+0

Я предполагаю, что вы не отметили комментарий. Считаете ли вы, что он был автоматически удален, потому что в нем содержалось слово 'Upvoted'? Странный. Во всяком случае, это намного лучше, потому что вам не нужно бросать и не ошибиться. – 2501

+0

@ 2501 Не совсем уверен, о чем вы говорите. Я не заметил никаких комментариев. – Lundin

+0

Положительный комментарий удален. – 2501

-2

Там уродливое решение, которое опирается на литье

typedef void* (*FunctionType)(int); 
void* func(int a){ 
    return (void*)func; 
} 

int main(void){ 
    FunctionType p = (FunctionType)func(3); 
} 
+4

функторов объекты и перегрузка операторов не будут хорошо работать в C, хотя. –

+1

'operator()' in C? «не будет работать хорошо» несколько занижена ... –

1

Есть функция возвращает указатель на функцию, а затем привести его к правильному типу:

typedef void(plain)(void); 
typedef plain*(type)(int); 

plain* Function2(int value); 

plain* Function(int value) 
{ 
    return (plain*)&Function2 ; 
} 

int main(void) 
{ 
    type* function = (type*)Function(55) ; 
} 

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

+0

Я думаю, что это примерно так же неопределенно, как и решение «void *». И по уважительным причинам: я вполне уверен, что это может испортить код, который выбирает подходящее соглашение о вызовах на многих системах. – Lundin

+0

@ Lundin Определяется: * Указатель на функцию одного типа может быть преобразован в указатель на функцию другого типа и обратно; результат сравнивается с исходным указателем. Если преобразованный указатель используется для вызова функции, тип которой несовместим с ссылочным типом, поведение не определено. * – 2501

+0

Да, я знаю об этом тексте. Дело в том, что компилятор ожидает функцию возвращаемого типа void, и вы даете ему возвращаемый тип указателя функции, или наоборот. Поэтому представляется вероятным, что типы несовместимы, и в этом случае вы вызываете неопределенное поведение, а компилятор генерирует неправильное соглашение о вызове. – Lundin

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