我有一个带有函数指针的结构,如下所示:
typedef int (*node_transition_func)( wint_t );
typedef struct lex_dfa_arc_t {
node_transition_func func;
int expected_return_val;
struct lex_dfa_node_t * node;
} LEX_DFA_ARC_T;
现在我想创建一个返回原型函数“int func(wint_c);”的函数。例如:
node_transition_func input_equals( wint_t input, wint_t desired ) { ... }
C中是否可以使上述功能真正起作用?我试图避免为每个字母定义一个函数(例如input_equals_letter_a,input_equals_letter_b,input_equals_letter_c等)。
我的另一种方法是让node_transition_func接受wint_t和wchar_t *所需的字符,但我很好奇我的第一种方法是否有效。
谢谢!
答案 0 :(得分:4)
你基本上可以模仿闭包& currying而不是“返回一个函数”,你返回一个具有函数指针和绑定变量的结构。有了几个#defines,它甚至可能看起来有点理智。
OTOH,当你使用某种语言时,你应该坚持使用它的习语。闭包不是C的强项。我建议你不要试图在C代码中过于通用,如果有疑问只使用switch(){}。答案 1 :(得分:2)
您无法在C中动态创建新函数。由于它是编译语言,并且编译器不是标准运行时的一部分,因此必须在编译时静态定义所有代码。
答案 2 :(得分:1)
看起来你正试图用C语言进行讨论(cue clippy :-)。我认为这在C技术上是可行的。你不是想创造新的功能。您正在尝试创建现有函数的替代绑定。它在C ++中非常简单,但如果模板元编程(特别是函子和绑定)没有语法糖,你就必须手动完成所有这些工作。你的另一种方法似乎更合理。
答案 3 :(得分:0)
我猜你的这个函数会遍历一个LEX_DFA_ARC_T列表并返回匹配元素的“func”成员吗?
没有理由不应该这样做。毕竟像node_transition_func这样的函数指针仍然只是一个指针。那说它可能不是最好的解决方案。
然而,由于你说的其他事情,我对我的猜测是否正确感到有些困惑。也许更多的背景可能会帮助我们回答你。
答案 4 :(得分:0)
这可能是你在C中做最接近的事情:
int input_equals_with_type(wint_t Input, wint_t desired) {
// Do some stuff with regard to different type of "desired"
return 1;
}
#define MAKE_NODE_TRANS_FUNC(type, wint_t desired) \
int node_transition_func_##type(wint_t input) { \
return input_equals_with_type(input, desired); \
}
MAKE_NODE_TRANS_FUNC(letter_a, letter_a_disired)
MAKE_NODE_TRANS_FUNC(letter_b, letter_b_desired)
// and so on...
这里的限制当然是因为函数是在编译时而不是运行时创建的,所以这不是“真正的”。但是,如果您只是尝试制作一些类型的函数,那么这就可以了。