【发布时间】: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++ 函数外部化并使用 stl,new运算符(会引发异常)。extern "C"唯一要做的就是防止名称篡改。
标签: c++ c gcc attributes extern-c