You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中能否用函数声明初始化函数指针?

在C++中用函数声明初始化函数指针?可行吗?

嘿,这个问题问得很到位!直接给结论:你提到的这两种写法在C++里都是不合法的,咱们来拆解下原因,再说说正确的打开方式。

为什么你的写法行不通?

函数声明的作用只是告诉编译器“存在一个名叫function、签名是void(void)的函数”,它本质上是一个“告知信息”,并没有生成实际的函数实体(也就是可执行的函数代码)。而函数指针需要绑定到实实在在存在的函数实体(即函数定义),不是一个空的声明。

咱们逐个看你的写法:

  • 第一种:void (*pointer)(void) = &( void function(void) );
    这里你试图对一个函数声明取地址,但函数声明根本不是一个可被取地址的表达式。编译器会直接报错——它既找不到function的实际定义,这种语法本身也不符合C++的规则。
  • 第二种:void (*pointer)(void) = void function(void);
    这种更直接,试图把函数声明直接赋值给指针,但函数声明不是一个能被当作右值使用的对象。编译器完全不知道你要指向哪个具体的函数,自然无法通过编译。

正确的函数指针初始化方式

要初始化函数指针,你得先有函数的定义(或者确保函数在当前作用域可见,且链接时能找到它的定义),然后用下面两种合法的方式:

  • 方式1:直接使用函数名(函数名会隐式转换为指向该函数的指针)
    // 先定义函数
    void function(void) {
        // 函数逻辑
    }
    
    int main() {
        void (*pointer)(void) = function; // 合法
        pointer(); // 调用函数
        return 0;
    }
    
  • 方式2:显式取函数的地址(和方式1等价,只是更明确)
    void (*pointer)(void) = &function; // 同样合法
    

额外提醒

如果你只写了函数声明(void function(void);)却没有定义,然后试图用function初始化指针,编译阶段可能不会报错(因为编译器知道这个函数存在),但链接阶段一定会报错——因为找不到函数的实际代码。所以一定要确保函数有完整的定义哦。

内容的提问来源于stack exchange,提问作者Roman Kwaśniewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:16:23