为什么我在C库中看到THROW?

myn*_*ynk 37 c c++ exception header-files

当我这样做:( less /usr/include/stdio.h这只是一个C库 - 与C++无关)

我看了__THROW很多函数声明.此外,一些函数上面的评论说'这个函数是一个可能的取消点,因此没有标记__THROW'这是什么?

throw 用于异常处理...但据我所知,C不提供任何支持.

请解释.

GMa*_*ckG 42

此标头可能在该供应商的C和C++编译器之间共享.你看看__THROW定义的是什么?

我怀疑类似于:

#ifdef __cplusplus
    #define __THROW throw()
#else
    #define __THROW
#endif
Run Code Online (Sandbox Code Playgroud)

或者对于实际规格:

#ifdef __cplusplus
    #define __THROW(x) throw(x)
#else
    #define __THROW(x)
#endif
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在C构建中,它扩展为空.在C++中,它可以满足您的期望.这允许供应商重用相同的文件.


只是为了挑剔,这并不完全正确:"(这只是一个C库 - 与C++无关)"

C++标准库包括使用C标准库的功能.实际的标题是<cxxx>这里xxx是C头名.也就是说,要<stdlib.h>在C++中包含C头,就可以了<cstdlib>.所以它确实与C++有关.:)

这就是你看到你所做的代码的原因.复制两种不同语言的标题将是维护和清洁的噩梦.


PSk*_*cik 7

你可以做

cpp -include stdlib.h -dM /dev/null  |grep '#define __THROW '
Run Code Online (Sandbox Code Playgroud)

了解它实际上扩展到了什么。

在我的系统上,我得到:

#define __THROW __attribute__ ((__nothrow__ __LEAF))
Run Code Online (Sandbox Code Playgroud)

抛出异常属性在被描述 https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes 如下:

带有此属性的外部函数调用只能通过返回或通过异常处理返回当前的编译单元。特别是,不允许叶子函数调用从当前编译单元传递给它的回调函数,直接调用由该单元导出的函数或将longjmp放入该单元中。叶子函数可能仍会从其他编译单元调用函数,因此从根本不包含任何函数调用的意义上来说,它们不一定是叶子。该属性用于库功能以改善数据流分析。编译器提示,叶子函数不能使用或修改任何未转义当前编译单元的数据。例如,sin函数是叶函数,而qsort不是。

请注意,叶函数可能会间接运行当前使用静态变量的编译单元中定义的信号处理程序。同样,当执行惰性符号解析时,叶函数可能会调用间接函数,这些函数的解析器函数或实现函数在当前编译单元中定义,并使用静态变量。没有编写这种信号处理程序,解析器函数或实现函数的符合标准的方法,并且您最好的办法是删除leaf属性或将所有此类静态变量标记为volatile。最后,对于支持符号插入的基于ELF的系统,应注意当前编译单元中定义的功能不要基于定义的标准模式和定义的功能测试宏意外插入其他符号;

该属性对当前编译单元中定义的功能没有影响。这是为了允许轻松地将多个编译单元合并为一个,例如,通过使用链接时优化。因此,不允许在类型上使用属性来注释间接调用。

h

nothrow nothrow属性用于通知编译器函数不能引发异常。例如,可以保证标准C库中的大多数函数都不会抛出异常,而带有函数指针参数的qsort和bsearch异常例外。

什么__attribute__((nothrow))手段C的回答在GCC -抛出异常用于什么属性?。基本上,它是与C ++代码配合使用的,如果该函数永远不会调用引发异常的C ++代码,则可以使用它。


Ioa*_*oan 5

要回答有关"此函数是可能的取消点,因此未标记为__THROW"的其他问题:这涉及多线程.你可以"取消"一个线程,但在到达取消点之前它实际上不会"取消".更多信息:http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html