【问题标题】:Does it make sense to use _attribute__ ((nothrow)) inside extern C?在 extern C 中使用 _attribute__ ((nothrow)) 有意义吗?
【发布时间】:2017-01-08 10:54:39
【问题描述】:

我有一些从 C++ 调用的 C 代码。
标头类似于以下内容:

#ifndef CLibH
#define CLibH

#ifdef __cplusplus
extern "C" {
#endif

//C API
void foo(void);
// ...

#ifdef __cplusplus
}
#endif

#endif

因为我已经在使用extern C
添加nothrow 编译器属性有什么好处吗?

#ifndef CLibH
#define CLibH

#ifdef __cplusplus
extern "C" {
#endif

//C API
void foo(void) __attribute__((nothrow));
// ...

#ifdef __cplusplus
}
#endif

#endif

extern C 是否使这变得多余?
在这种情况下应用它还有优势吗?

【问题讨论】:

  • @iharob:它可以调用外部 Fortran 代码,这可能会抛出。
  • @iharob 没错。所以编译器应该在有或没有属性的情况下进行相同的优化?我不确定库是否有一些微妙之处,或者 C 代码是否可以回调 C++ 等。
  • @KerrekSB 所以“extern C”不能保证“不抛出”。如果一个函数被包裹在“extern C”中,它仍然可以抛出。这是有道理的。
  • extern "C" 可以直接调用标记为extern "C" 的C++ 代码。所以问题变成了异常可以从标记为extern "C"的C++函数中传播出去吗?
  • 我觉得自己很傻。我自己编写了一个 c++ 插件系统,它当然使用 c 来构造类。构造函数可以抛出,我当然使用了new,所以它一点也不多余。事实上,您可以将任何 c++ 函数外部化并使用 stlnew 运算符(会引发异常)。 extern "C" 唯一要做的就是防止名称篡改。

标签: c++ c gcc attributes extern-c


【解决方案1】:

是的,确实如此。来自 gcc 文档:

例如,标准 C 库中的大多数函数都可以 保证不会抛出明显异常的异常 qsort 和 bsearch 接受函数指针参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2021-07-15
    • 2012-05-12
    相关资源
    最近更新 更多