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
相关产品推荐
相关产品推荐

