我在一个cpp文件中看到external "C" {...}
包含了几个函数的定义。在
链接中的示例表明,^ {< CD2>}只包含C++函数的声明,而不是它们的定义
Just declare the C++ function extern "C" (in your C++ code) and call it (from your C or C++ code). For example:
// C++ code: extern "C" void f(int); void f(int i) { // ... }
我在开头提到的cpp文件看起来像:
// C++ code:
extern "C" {
void f(int i)
{
// ...
}
void g(int i)
{
// ...
}
}
将{cd2>}包含C++函数的声明或定义? 如果是,为什么?在
它应该把声明放在头文件中,只要翻译单元是用c++编译器编译的,并且声明在那里看不到,就应该把定义括起来。
在c++代码中同时使用这两种方法是绝对正确的。在
如果用c编译器编译函数定义,就没有必要(或者我应该说语法是错误的,请参阅下面的注释)。在
extern "C" {}
作用域控制将普通c符号链接用于内部的所有内容。否则将应用c++ name mangling。在注:
由于
extern "C" {}
这不是有效的c语法,要使其与c编译器一起工作,您需要在#ifdef
中使用它:MyHeader.h
:extern "C" {}
作用域的使用实际上有两个方面:< H3>将C++代码导出到C<EH3>
如果上面的代码是用c编译器编译的,那么它看起来就像一个普通的c函数声明。如果使用c++编译器编译,
extern
关键字将应用,并且c++名称的损坏将被抑制。在关于定义,函数可以在其定义中使用任何c++功能:
^{pr2}$请注意,声明不包括在这里。这可以作为一种技术使用,当您想重写从weak linkage的库中公开的函数时尤其有用。在
如果包含
MyHeader.h
,则可以省略extern "C" {}
范围。在< H3>从C++ +EH3>导入C代码
如果在c++编译器中看到上述声明,则再次禁止c++名称损坏,并且链接器将使用纯c函数符号名解析对
^{3}$foo()
的任何调用引用:foo()
函数实现是从使用c编译器创建的对象文件(或归档文件)中提供的。在在[dcl.链接]/第五章:
就函数的语言连接而言,这两个版本都很好。重要的部分是函数的第一个声明必须有
extern "C"
。在最好包括两者。在
< >在C++中连接C代码时,确保符号不被损坏。我们使用外部“C”块。在每当在外部“C”块中放置一些代码时,C++编译器就确保函数名不被破坏,即编译器生成一个二进制文件,它们的名称不变,就像C编译器所做的那样。在
因为C不支持函数重载。所以在C++中连接C代码时,我们使用外部的C块。在
相关问题 更多 >
编程相关推荐