我知道如何使用,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"必要的真实例子吗?
您可以使用它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定义),一切都将是非破坏的.
extern "C"从库导出函数时的一种非常常见的用法。如果您不禁用 C++ 名称修饰,您的库的客户端将很难命名您的函数。同样,当您转向另一个方向时,当您导入已通过 C 链接导出的函数时。
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |