C++ 为什么我会看到一个C库?
当我这样做时:C++ 为什么我会看到一个C库?,c++,c,exception,header-files,C++,C,Exception,Header Files,当我这样做时: less/usr/include/stdio.h(它只是一个C库,与C++无关) 在许多函数声明之后,我看到了\uuu抛出。 此外,一些函数上面的注释表示“此函数是一个可能的取消点,因此没有标记\uu THROW” 这一切是为了什么 throw是用来处理异常的……但据我所知,C不提供任何支持 请解释。 < P>这个头很有可能在那个供应商的C和C++编译器之间共享。你看了\u THROW的定义了吗 我怀疑类似于: #ifdef __cplusplus #define __T
less/usr/include/stdio.h
(它只是一个C库,与C++无关)
在许多函数声明之后,我看到了\uuu抛出。
此外,一些函数上面的注释表示“此函数是一个可能的取消点,因此没有标记\uu THROW
”
这一切是为了什么
throw
是用来处理异常的……但据我所知,C不提供任何支持
请解释。
< P>这个头很有可能在那个供应商的C和C++编译器之间共享。你看了\u THROW
的定义了吗
我怀疑类似于:
#ifdef __cplusplus
#define __THROW throw()
#else
#define __THROW
#endif
或对于实际规格:
#ifdef __cplusplus
#define __THROW(x) throw(x)
#else
#define __THROW(x)
#endif
正如您所看到的,在C构建中,它扩展为零。在C++中,它符合你的期望。这允许供应商重用相同的文件
只是吹毛求疵,这并不完全正确:“(这只是一个C库——与C++无关)。”
C++标准库包含使用C标准库的能力。实际的头是
,其中xxx
是C头的名称。也就是说,在C++中包含C标题“代码> <代码>,你可以执行<代码> <代码>。所以它与C++有关:p>
这就是为什么你会看到你所做的代码。复制两种不同语言的标题将是维护和清洁的噩梦。要回答关于“此函数可能是一个取消点,因此没有标记为_-THROW”的其他问题,这涉及多线程。您可以“取消”一个线程,但在到达取消点之前,它实际上不会“取消”。更多信息:您可以
cpp -include stdlib.h -dM /dev/null |grep '#define __THROW '
了解它实际上扩展到什么
在我的系统上,我得到:
#define __THROW __attribute__ ((__nothrow__ __LEAF))
nothrow和leaf属性在中进行了描述
详情如下:
leaf
对具有此属性的外部函数的叶调用必须返回到
当前编译单元只能通过返回或异常处理进行设置。
特别是,不允许叶函数调用回调函数
从当前编译单元直接传递给它的函数
调用单元导出的函数,或将longjmp调用到单元中。叶子
函数仍然可以调用来自其他编译单元和
因此,它们不一定是叶子,因为它们不包含任何元素
函数调用。该属性用于库函数
改进数据流分析。编译器接受以下提示:
无法使用或删除未从当前编译单元转义的数据
由叶函数修改。例如,sin函数是一个叶子
函数,但qsort不是
请注意,叶函数可能会间接运行定义的信号处理程序
在使用静态变量的当前编译单元中。同样地,
当惰性符号解析生效时,叶函数可能会调用
其解析器函数或实现函数的间接函数
在当前编译单元中定义并使用静态变量。
没有符合标准的方式来编写这样的信号处理程序,
解析器函数,或实现函数,以及您认为最好的
可以做的是删除leaf属性或标记所有此类静态
变量不稳定。最后,对于支持符号的基于ELF的系统
插入时,应注意
当前编译单元不会意外插入其他符号
基于定义的标准模式和定义的特征测试宏;
否则将添加一个无意的回调
该属性对当前文件中定义的函数没有影响
汇编股。这是为了方便合并多个
例如,使用链接时间将单元编译为一个
优化。由于这个原因,不允许在要访问的类型上使用该属性
注释间接调用
nothrow
nothrow nothrow属性用于通知编译器
函数无法引发异常。例如,中的大多数函数
可以保证标准C库不会抛出异常
qsort和bsearch中使用函数指针的显著例外
争论
在C中,\uuuuu属性((nothrow))
的意思在中得到了回答。基本上,它是与C++代码的合作,如果函数不调用异常代码C++,那么你可以使用它。在我看来像是GCC。(请记住,没有“标准库”,因此指定您使用的实现很有帮助。)啊,我看到您发现了glibc:)谢谢。已完全更改为另一个仍然提供有用信息的链接。谢谢,您的回答非常有用。THROW宏的定义如下:如果未定义uu cplusplus#define u THROW u属性((nothrow LEAF))。如果定义了uu cplusplus,则u THROW是extend to THROW()__叶子定义如下:α定义α叶,如果叶定义为GNUC,则为真,否则,在C和C++中,Y抛出是无用的。