【问题标题】:Is it possible to pass an implicit function as a function pointer in C?是否可以在 C 中将隐式函数作为函数指针传递?
【发布时间】:2013-02-23 19:32:12
【问题描述】:

最近我发现可以通过在函数调用中强制转换来将隐式数组传递给函数

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

但是,我想知道在将函数指针传递给函数时是否可以做同样的事情,比如:

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

那么有可能做到这一点吗?

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

非常感谢

【问题讨论】:

    标签: c function-pointers


    【解决方案1】:

    不,不在标准 C 中。不过,您有两个非标准替代方案:

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

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

    二、Apple 的块(最近的 GCC 和 Clang):

    void call(void (^blk)())
    {
        blk();
    }
    
    call(^{
        printf("Hello world!\n");
    });
    

    【讨论】:

    【解决方案2】:

    “隐式数组”实际上是 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");
        })
    );
    

    【讨论】:

      【解决方案3】:

      您正在寻找的功能不是 C 标准的一部分。然而,这正是 blocks(Apple 对该标准的扩展)旨在解决的问题(或问题之一)。如果您正在为 OS X 10.5 或更高版本进行编译(或在其他受支持的平台上将 clang 与 Blocks 运行时一起使用;请参阅 mackyle/blocksruntime),您可以将代码更改为以下内容:

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

      然后像这样调用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 2011-02-28
        • 2022-01-20
        • 2010-12-22
        • 1970-01-01
        相关资源
        最近更新 更多