猿问

为什么我们需要在C ++中使用extern“C”{#include <foo.h>}?

为什么我们需要在C ++中使用extern“C”{#include <foo.h>}?

为什么我们需要使用:

extern "C" {#include <foo.h>}

特别:

  • 我们什么时候应该使用它?

  • 在编译器/链接器级别发生了什么,需要我们使用它?

  • 如何在编译/链接方面解决了需要我们使用它的问题?


慕容3067478
浏览 1642回答 3
3回答

幕布斯7119047

C和C ++在表面上相似,但每个编译成一组非常不同的代码。当您使用C ++编译器包含头文件时,编译器需要C ++代码。但是,如果它是一个C头,则编译器需要将头文件中包含的数据编译为某种格式--C ++'ABI'或'应用程序二进制接口',因此链接器会扼杀。这比将C ++数据传递给期望C数据的函数更可取。(为了深入了解真正的细节,C ++的ABI通常会“破坏”它们的函数/方法的名称,所以在printf()不将原型标记为C函数的情况下进行调用_Zprintf,C ++实际上会生成代码调用,最后加上额外的废话。 )所以:extern "C" {...}当包括ac头时使用- 就这么简单。否则,您将在编译的代码中出现不匹配,并且链接器将会阻塞。但是,对于大多数标头,您甚至不需要它,extern因为大多数系统C标头已经考虑到它们可能包含在C ++代码中并且已经包含extern它们的代码。
随时随地看视频慕课网APP
我要回答