何时使用extern"C"?

use*_*214 5 c++ extern-c

我知道如何使用,extern "C"但必须使用它的条件是什么?

extern "C"告诉C++编译器不要对大括号内的代码执行任何名称修改.这允许您从C++中调用C函数.

例如:

#include <string.h>

int main()
{
    char s[] = "Hello";
    char d[6];

    strcpy_s(d, s);
}
Run Code Online (Sandbox Code Playgroud)

虽然这在VC++上编译得很好.但有时这写成:

extern "C" {   
#include <string.h>  
}
Run Code Online (Sandbox Code Playgroud)

我没有看到这一点.你能举一个extern "C"必要的真实例子吗?

pax*_*blo 7

您可以使用它extern "C"来防止头文件和C++目标文件中的名称损坏,以防止已经编译而没有损坏的库或对象.

例如,假设您有一个widget使用C编译器编译的库,以便其发布的接口不受损坏.

如果将头文件原样包含在代码中,它将假定名称破坏,并且那些受损的版本是您将告诉链接器要查找的内容.

但是,既然你会要求类似的东西function@intarray_float_charptr而且widget图书馆只会发布function,你就会遇到问题.

但是,如果您将其包含在:

extern "C" {
    #include "widget.h"
}
Run Code Online (Sandbox Code Playgroud)

你的编译器会知道应该尝试使用function非破坏版本.

这就是为什么在C语言的头文件意味着包含在C _或C++程序中,你会看到如下内容:

#ifdef __cplusplus
    extern "C" {
#endif

// Everything here works for both C and C++ compilers.

#ifdef __cplusplus
    }
#endif
Run Code Online (Sandbox Code Playgroud)

如果使用C编译器来包含它,则这些#ifdef行将导致extern "C"内容消失.对于C++编译器(在哪里__cplusplus定义),一切都将是非破坏的.


Dav*_*nan 4

extern "C"从库导出函数时的一种非常常见的用法。如果您不禁用 C++ 名称修饰,您的库的客户端将很难命名您的函数。同样,当您转向另一个方向时,当您导入已通过 C 链接导出的函数时。