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

