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

catch语句中`const int *__errno_location ()`声明的作用及假设验证

问题解析与验证

你的假设核心结论

你的假设方向正确,但需要更精准的表述:catch(const int *foo())实际上是在捕获返回const int*类型的函数指针,而非泛泛的“返回int指针的函数指针”(要明确const的修饰作用)。

语法细节拆解

在C++中,当函数声明作为类型出现时(比如catch的参数类型、变量声明场景),会自动退化为函数指针类型。所以:

catch(const int *foo())

等价于:

catch(const int* (*foo)())

这里的foo是一个函数指针,指向的函数签名为const int* ()(无参数、返回const int*)。

测试代码逻辑验证

你的测试代码中:

  • blah是返回const int*的函数,&blah就是该函数的指针,类型为const int* (*)()
  • throw &blah抛出的正是这个函数指针
  • catch块匹配到该类型后,foo指向blah函数,调用foo()等价于调用blah(),返回指向值为10的int的指针,解引用后输出10,和你的测试结果完全一致。

最初问题的根源

你最初写的catch(const int errno)失效,是因为<errno.h>中的宏定义:

#define errno (*__errno_location())

会把代码展开为:

catch(const int (*__errno_location()))

__errno_location是返回int*的函数,所以展开后的catch类型是int* (*)()(返回int指针的函数指针),和你抛出的int类型完全不匹配,自然无法捕获异常。

关键教训:errno是C/C++标准库的保留宏名,绝对不能用作自定义变量名,否则会触发这类隐蔽的宏替换问题。

内容的提问来源于stack exchange,提问作者Keheck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:52:10