c - 使用函数指针的静态结构初始化

标签 c static initialization structure

我已经用函数名初始化了一个静态结构,如下所示。

我们必须用常量初始化静态结构。函数名在 C 中是常量吗?

struct fp {
        int (*fn)();
};
int f1()
{
        printf("f1 called \n");
        return 0;
}
static struct fp fps = {
        .fn = f1,
};
int main()
{
        fps.fn();
        return 0;
}

如果初始化结构时编译没有任何问题,如下所示。

static struct fp fps = {
        .fn = &f1,
};

在 C 语言中,函数名 f1 和 &f1 是否相同?

最佳答案

f1 是函数的名称。在大多数情况下,当用作表达式时,函数名称会自动衰减为指向该函数的指针。不发生衰减的一种情况是函数名称是寻址运算符 (&) 的操作数。因此,作为计算表达式,f1&f1 通常是相同的。

事实上,在任何函数调用表达式f(args)中,f都是一个指向函数的指针。您可以简单地通过函数名称调用函数的原因是因为从函数名称到函数指针的自动衰减。

您也可以扭转这一局面并取消引用函数指针。它们会立即衰减回指针:

int f(void);

f();         // "f" decays to &f
(&f)();      // normal call via function pointer, no implicit decay
(*f)();      // why not
(*****f)();  // ditto

关于c - 使用函数指针的静态结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642715/

相关文章:

c++ - 为什么矩阵没有正确初始化/打印?

c - 不同路径下的clang有什么区别?

c - 为什么 printf ("%d%d%d",++i, i, i++) 是未定义的行为?

C++类成员是一个需要构造函数的对象......需要一个函数来实例化

c++ - 在类成员声明中获取 sizeof(MyClass)

c++ - 两个 DLL C++ 中的静态成员

c# - 这是什么语法,将接口(interface)初始化为类数组? (新的 IItemTransform[0])

无法让多数组在 c 中工作

c - execv 如何从管道获取输出?

java - 为什么Java编译器允许通过空对象访问静态变量?