您的C例子是無效的ISO C.它可以在C只使用也是有效的C的特徵進行++:
typedef void (*func_type)();
typedef func_type (*func_func_type)();
int i = 5;
func_type f() { return --i ? (func_type)f : 0; }
int main()
{
func_func_type func = f;
do
{
func = (func_func_type)func();
}
while(func);
}
不能重新寫這直接因爲使用lambda表達式拉姆達不能引用本身(如f
一樣),但你可以在lambda轉換爲一個函數指針,保留從一個函數指針類型強制轉換到另一個,並將其存儲在一個std::function
這樣的:
#include <functional>
typedef void (*func_type)();
typedef func_type (*func_func_type)();
int i = 5;
func_func_type f = (func_func_type)[]{ return --i ? (func_type)f : nullptr; };
int main()
{
std::function<func_type()> func = f;
do
{
func = (func_func_type)func();
}
while(func);
}
你C示例不可移植,標準C不允許轉換func指針指向其他類型的指針。 –
@Olaf,問題不是「我可以在C中使用lambda表達式嗎?」它是「我可以用C++中的lambda來做到這一點嗎?」所以C是否支持lambda表達式並不重要。 –
這是一個非常模糊的提示。 –