Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我会看到一个C库?_C++_C_Exception_Header Files - Fatal编程技术网

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))
nothrowleaf属性在中进行了描述 详情如下:

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抛出是无用的。