C语言中__THROW宏的含义与作用解析
关于__THROW宏和throw()的解惑
先直接说结论:__THROW是个跨C/C的兼容性宏,用来适配两种语言的异常机制差异,而throw ()是C里的异常规范,意思是这个函数不会抛出任何异常。
1. __THROW宏的两种定义场景
- 在纯C编译环境下,这个宏会被定义成空(或无实际意义的占位符),因为C本身不支持异常,编译时直接忽略这部分,完全不影响函数的正常声明。
- 在C编译环境下,它被替换成
throw (),这是C专门用来标注函数异常行为的语法。
2. throw ()到底是什么?
这是C早期的动态异常规范写法,括号为空就表示该函数承诺绝对不会抛出任何异常。如果编译器检测到这个函数内部(或它调用的函数)抛出了异常,就会触发std::unexpected函数处理(默认行为是终止程序)。
需要注意的是,C11之后这种写法已经被弃用,现在推荐用noexcept关键字替代,但很多老版本的标准库代码(比如你看到的malloc声明)还保留了这种传统写法。
3. 为什么C的标准库函数里会出现这个宏?
因为标准库的头文件是给C和C++编译器通用的:
- 对C++代码来说,标注C库函数不会抛异常,编译器可以据此做优化(比如减少异常处理相关的代码生成),同时也能让开发者放心调用,不用额外处理异常逻辑。
- 对C代码来说,这个宏直接失效,完全不影响C语言用错误码处理错误的原有逻辑。
比如你看到的malloc声明,在C编译时会变成:
extern void *malloc (size_t __size) __attribute_malloc__ __attribute_alloc_size__ ((1)) __wur;
而在C++编译时则是:
extern void *malloc (size_t __size) throw () __attribute_malloc__ __attribute_alloc_size__ ((1)) __wur;
内容的提问来源于stack exchange,提问作者Konstei
相关产品推荐
相关产品推荐

