我在Python中实现了一个简单的状态机:
import time
def a():
print "a()"
return b
def b():
print "b()"
return c
def c():
print "c()"
return a
if __name__ == "__main__":
state = a
while True:
state = state()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
我想把它移植到C,因为它不够快.但是C不允许我创建一个返回相同类型函数的函数.我试过制作这种类型的功能:typedef *fn(fn)()但它不起作用,所以我不得不使用一个结构.现在代码非常难看!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct fn {
struct fn (*f)(void);
} fn_t;
fn_t a(void);
fn_t b(void);
fn_t c(void);
fn_t a(void)
{
fn_t f = {b};
(void)printf("a()\n");
return f;
}
fn_t b(void)
{
fn_t f = {c};
(void)printf("b()\n");
return f; …Run Code Online (Sandbox Code Playgroud) 在stackoverflow中读取一个问题,我想知道是否可以声明一个带有指向自身的函数.即进行此类声明foo,以下内容是正确的:
foo(foo);
Run Code Online (Sandbox Code Playgroud)
最简单的想法是转换为另一个函数指针(不能转换为void*,因为它可能更小),所以函数声明如下所示:
void foo(void (*)());
Run Code Online (Sandbox Code Playgroud)
虽然这在C中是可以的(并且可以在C++中使用,但我想知道,是否可以在没有这种"重新解释"铸造或丢失类型信息的情况下完成.
换句话说,我想要以下声明:
void foo( void (*)( void (*)( void (*) ( ... ))));
Run Code Online (Sandbox Code Playgroud)
但是,当然,无限制的声明是不可能的.天真typedef也无济于事.
C++模板是受欢迎的,即使它们使调用代码(foo(foo))看起来不那么简洁,但仍然是有限的.
显示的C风格答案,如何在不进行投射的情况下丢弃类型信息,或者其他类型的技巧当然是有趣的,但不会被接受.
示例:一个函数,它接受一个函数(带有一个函数(那个......)和一个int)和一个int.
typedef void(*Func)(void (*)(void (*)(...), int), int);
Run Code Online (Sandbox Code Playgroud)
它以递归方式爆炸(...).是否存在无法完成的根本原因或是否存在其他语法?在我看来,没有演员阵容应该是可能的.我真的想传递一个调度表,但如果我可以通过这一种类型,我可以想出来.
我想声明一个块类型,它采用一个相同块类型的参数.它就是这样的:
typedef void (^BlockInBlock) (BlockInBlock block);
Run Code Online (Sandbox Code Playgroud)
我知道声明无效.但我想知道是否有任何可能的方法来实现递归块,它只采用一个相同块类型的参数.
我正在尝试使用块在Objective-C中找到一种实现面向方面编程(AOP)的方法.以下是关于如何实现这一点的问题.
进一步的问题1:
如何实现一个可变参数函数,它接受我上面描述的许多块并最终结束nil,并且我可以使用多个块调用该函数,直到遇到nil?它会是这样的:
@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
va_list blockList;
va_start(blockList, headBlock);
// Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
// it would be like: block1(self, block2(self, block3(self, block4(...))));
va_end(blockList);
}
@end
Run Code Online (Sandbox Code Playgroud)
进一步的问题2:
如果递归块有返回值怎么办?
关于C语言的其他问题:
是否可以声明一个C函数,它接受一个C函数指针的参数,而C函数指针的函数也需要另一个C函数指针?
我想定义一个函数类型,它返回一个指向同一类型函数的指针.我试过这个:
typedef state* (*state)(lex*);
Run Code Online (Sandbox Code Playgroud)
但我得到的syntax error就像你猜的那样.
我想要一个带有返回成员函数指针的成员函数的类。
也就是说,类似:
class Foo {
// typedef ????(Foo::* func)????
public:
Func s1();
Func s2();
Func s3();
}
Func Foo::s1() {
// do stuff
return &Foo::s2;
}
Func Foo::s2() {
// do stuff
return &Foo::s3;
}
Func Foo::s3() {
// do stuff
return 0;
}
Run Code Online (Sandbox Code Playgroud)
基本上,我尝试做的是实现一个状态机,其中每个状态现在都是下一个状态,并通过函数指针返回它。
注意:我对实现状态机的其他方法不感兴趣。我真的很想知道它是否可以以上面这样的方式实现。
背景:我受到这个演讲的启发:http://www.youtube.com/watch?v =HxaD_trXwRE,并想知道是否可以在 C++ 中使用类似的模式。