【问题标题】:C function name or function pointer? [duplicate]C函数名还是函数指针? [复制]
【发布时间】:2017-02-09 21:43:04
【问题描述】:

让我们看看这段代码:

#include <stdio.h>

typedef int (*callback) (void *arg);
callback world = NULL;

int f(void *_) {
    printf("World!");
    return 0;
}

int main() {
    printf("Hello, ");
    // world = f;
    world = &f; // both works
    if (world != NULL) {
        world(NULL);
    }
}

当设置world 变量时,两者 world = f;world = &amp;f; 有效。

我应该使用哪个?是依赖编译器还是C版本?

% gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

【问题讨论】:

标签: c function-pointers


【解决方案1】:

您的函数f 的类型为int (void *_)。每当在表达式中使用f 时,它都会隐式转换为指向自身的指针,该指针的类型为int(*) (void *_)

我应该使用哪个?

因此,出于所有实际目的,函数名称f 和指向同一函数的指针&amp;f 是可以互换的。也可以看看"Why do all these function pointer definitions all work? "

它取决于编译器还是 C 版本?

不依赖于任何编译器或 C 版本。

【讨论】:

    【解决方案2】:

    world = f;world = &amp;f; 都有效,因为 f&amp;f 作为参数传递时没有区别。

    请参阅C99 规范(第 6.7.5.3.8 节)。

    将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如 6.3.2.1 中所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2018-01-28
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多