2013-02-23 67 views
2

最近我发现,可以通过在函数调用铸造它传递一个隐含的阵列功能是否可以将隐式函数作为C中的函数指针传递?

void foo(int* array); 
foo((int[4]) {1,2,3,4}); 

不过,我想知道,如果它传递功能时,有可能做同样的事情指向一个函数,所以像这样:

void bar(void (*foobar)(void)); 
bar((void) {printf("foobar\n");}); 

所以它甚至可以做到这一点?

我想知道的原因是,如果我有一大块可能具有特定循环结构的代码块,但实例之间的核心功能发生了变化,我不希望使用多个临时代码乱丢代码函数只是为了将它们传递给另一个函数。因此希望能够在参数中定义临时函数。

非常感谢

回答

5

不,不是在标准C.你有两个非标准的替代品,但:

一个。 GCC的 “嵌套函数” 扩展名(仅GCC):

void call(void (*fn)()) 
{ 
    fn(); 
} 

void somefunc() 
{ 
    void tmp_func() 
    { 
     printf("Hello world!\n"); 
    } 
    call(tmp_func); 
} 

二,苹果块(最近GCC和锵):

void call(void (^blk)()) 
{ 
    blk(); 
} 

call(^{ 
    printf("Hello world!\n"); 
}); 
+0

顺便第一种方法,有也是在这个答案的一些宏(和解释):http://stackoverflow.com/questions/10405436/anonymous-functions -using-gcc-statement-expressions - 更不用说这里稍微更坚果的版本了:http://en.wikipedia。org/wiki/Anonymous_function#C_lambda_expressions – slugonamission 2013-02-23 19:40:33

+0

@slugonamission让我们不要用预处理器破解:) – 2013-02-23 19:40:49

+0

够公平的:) - 当我为这个答案寻找答案时,我发现它们很有趣。我倾向于采取行如果你不明白的宏,你可能不应该在你的代码虽然:) – slugonamission 2013-02-23 19:43:00

0

你要找的功能是不是C标准的一部分。但是,这正是区块 - 标准的Apple扩展 - 的问题(或其中一个问题),旨在解决此问题。如果您正在编译为OS X 10.5或更高版本(或使用clang与其它支持的平台块的运行;见mackyle/blocksruntime),您可以更改您的代码是这样的:

void bar(void (^foobar)(void)); 

并调用是这样的:

bar(^{ 
    printf("foobar\n"); 
}); 
1

“隐式数组”实际上是compound literal,它是C99特有的。

,另一方面匿名函数不能使用标准C,如果你使用GNU GCC来实现,你可以模仿他们用两个扩展:

  1. Nested Functions
  2. Statement expressions

首先创建一个包装宏:

#define lambda(return_type, body)  \ 
({         \ 
    return_type lambda_function body; \ 
    lambda_function;     \ 
}) 

然后,你可以使用它像这样

bar(lambda(void, (void) 
    { 
     printf("foobar\n"); 
    }) 
); 
相关问题