说我有以下C ++代码:
int x;
some_class y;
extern "C" {
void foo () {
// do something with x
// do something with y
}
}
是否需要使用x
声明y
和/或extern "C"
?
答案 0 :(得分:6)
没有。使用C ++语言链接访问函数和变量的extern "C"
函数没有限制。
C ++ extern "C"
函数通常用于为使用C ++语言链接的代码提供C接口,因此如果是这种情况则会有一点限制。
答案 1 :(得分:1)
C ++方法/函数支持重载,使它们以稍微复杂的方式链接。外部“C”的作用实际上是说“不要让我超载并使用好的旧C语言”,这使它与C代码兼容。
编辑:Charles Bailey指出我显然错误地以相同的方式连接变量。换句话说,如果变量由外部C代码使用(它们可能是因为它们不是静态的),则应将它们放在extern“C”中。如果您只是在文件内部或仅使用外部C ++代码中使用它们,那么您可以将它们保留在原来的位置。
答案 2 :(得分:1)
好吧,不需要使用extern "c"
声明变量。
事实上,使用extern "C"
甚至不需要使用函数,因为您使用extern "C"
您可以自由编写如下代码:
void bla() {cout<<"bla\n";}
extern "C" void sh() {bla();}
函数“sh”将使用c ++编译器进行编译,因此可以自由调用bla。 extern "C"
仅影响函数的名称。
答案 3 :(得分:-2)
extern "C"
仅对函数有用,对数据无效。它定义了函数被装饰或修改的方式。装饰还取决于使用的调用约定。不能在C中使用类,也不能使用类作为参数的函数,即使在extern "C"
块中也是如此。
extern "C"
有意义,C库和C ++代码将使用C库。
总之,extern "C"
中的一个类没有意义,x
只是一个基本类型,内部或外部无关紧要。使用该功能的常规方法是将标题的所有内容都放在这样的块中。在标题中声明int
并不是一个好主意!这将为每个翻译单元创建一个变量,并在链接时造成麻烦...不确定您打算如何处理类似于您发布的代码。