首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >extern"C“与extern的差异

extern"C“与extern的差异
EN

Stack Overflow用户
提问于 2017-05-19 03:37:19
回答 2查看 1.9K关注 0票数 8

是对整个头部使用extern "C"说明符,还是为每个函数指定extern,这有什么区别吗?

据我所知,没有,因为只有函数和变量可以外部链接,所以当我在每个函数原型和外部变量之前使用extern说明符时,我不需要使用全局extern "C"声明!?

示例A:

代码语言:javascript
复制
#ifdef __cplusplus
extern "C" {
#endif

void whatever(void);

#endif

示例B:

代码语言:javascript
复制
extern void whatever(void);
EN

回答 2

Stack Overflow用户

发布于 2017-05-19 03:58:35

C++文件中的extern "C"允许从C客户机调用方代码调用特定的C++函数。

有什么关系?

很久很久以前,C编译器生成的代码和寻址的函数都是按名称命名的。它没有考虑参数。

在C++中引入重载函数时,需要extern "C"为不同的函数指定相同的名称。例如,在C++中,f()void f(int)是两个不同的函数。

C++编译器通过名称篡改实现了这一点。它将一些信息添加到与函数参数相关的函数名称中。

extern "C"是对编译器的一个命令,用于“引用旧风格的命名约定--没有损坏”。

票数 13
EN

Stack Overflow用户

发布于 2017-05-19 03:59:44

这两件事是有区别的。

第一个是“这里的函数应该被编译成可以从C调用”。C++允许多个函数具有相同的名称,只要它们采用不同的参数。C则不会。为此,C++在其函数的编译名称中包含了参数类型信息。因此,C编译器将无法找到这些函数。如果您添加了一个extern "C",那么您将获得C行为,但您将获得从C调用这些函数的能力。

后者表示“此函数存在于另一个编译单元中”。这意味着编译器应该相信具有该签名的函数存在,而不是担心看不到它。你保证你链接的时候它就会在那里。声明(与定义相反)默认情况下是外部的,因为至少是C99。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44056461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档