C++中检查结构体函数指针是否赋值及初始化语法疑问
函数指针成员的两个疑问解答
一、能否用if(a->foo)判断函数指针是否已赋值?
完全可以。函数指针本质属于指针类型,空指针在布尔上下文会被判定为false,非空指针则为true。只要DLL在赋值时只会写入有效函数地址或保持空指针状态,这个判断就能安全帮你跳过未赋值的情况,避免调用空指针引发程序崩溃。你的测试代码里初始空指针时进入else、赋值后进入if的表现,也完全符合这个逻辑的预期。
二、函数指针声明后加{}的写法是否正确?
在**C++**环境下这个写法是合法的,它的作用是给函数指针成员设置默认初始化值:将foo初始化为空指针(等价于nullptr)。
如果不加{},局部结构体变量_a的foo成员会处于未初始化状态,存储的是随机垃圾值。此时if(a->foo)的判断结果完全不可预测——垃圾值可能恰好是非零,会让你误以为指针已赋值,进而触发错误调用。所以加{}是为了确保初始状态下指针明确为空,让后续的非空判断具备实际意义。
注意:该写法是C++特有的,C语言标准不支持结构体成员用这种方式做默认初始化,C语言中需要在定义变量时手动给成员赋值。
内容的提问来源于stack exchange,提问作者habi
相关产品推荐
相关产品推荐

