当前位置:  开发笔记 > 编程语言 > 正文

何时在C++中使用extern"C"?

如何解决《何时在C++中使用extern"C"?》经验,为你挑选了2个好方法。

extern"C"使名字没有被破坏.

它用于:

    我们需要在C++中使用一些C库

    extern "C" int foo(int);
    

    我们需要将一些C++代码导出到C语言

    extern "C" int foo(int) { something; }
    

    我们需要一种解析共享库中符号的能力 - 所以我们需要摆脱破坏

    extern "C" int foo(int) { something; }
    ///
    typedef int (*foo_type)(int);
    foo_type f = (foo_type)dlsym(handle,"foo")
    


Cygon.. 14

extern"C"有意义的地方是当你链接到编译为C代码的库时.

extern "C" {
  #include "c_only_header.h"
}

否则,您可能会遇到链接器错误,因为该库包含具有C-linkage(_myfunc)的函数,但C++编译器将库的头部处理为C++代码,为函数生成C++符号名称("_myfunc @ XAZZYE" - 这是称为mangling,每个编译器都不同).

使用extern"C"的另一个地方是保证C链接,即使对于用C++编写的函数,例如.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}

这样的函数可以导出到DLL,然后可以从其他编程语言调用,因为编译不会破坏它的名字.如果添加了同一功能的另一个重载,例如.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
  cout << "Hello, " << name << endl;
}

然后,大多数编译器会捕获这个,从而阻止您在DLL-public函数中使用函数重载.



1> Artyom..:

extern"C"使名字没有被破坏.

它用于:

    我们需要在C++中使用一些C库

    extern "C" int foo(int);
    

    我们需要将一些C++代码导出到C语言

    extern "C" int foo(int) { something; }
    

    我们需要一种解析共享库中符号的能力 - 所以我们需要摆脱破坏

    extern "C" int foo(int) { something; }
    ///
    typedef int (*foo_type)(int);
    foo_type f = (foo_type)dlsym(handle,"foo")
    



2> Cygon..:

extern"C"有意义的地方是当你链接到编译为C代码的库时.

extern "C" {
  #include "c_only_header.h"
}

否则,您可能会遇到链接器错误,因为该库包含具有C-linkage(_myfunc)的函数,但C++编译器将库的头部处理为C++代码,为函数生成C++符号名称("_myfunc @ XAZZYE" - 这是称为mangling,每个编译器都不同).

使用extern"C"的另一个地方是保证C链接,即使对于用C++编写的函数,例如.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}

这样的函数可以导出到DLL,然后可以从其他编程语言调用,因为编译不会破坏它的名字.如果添加了同一功能的另一个重载,例如.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
  cout << "Hello, " << name << endl;
}

然后,大多数编译器会捕获这个,从而阻止您在DLL-public函数中使用函数重载.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有