是否需要在源文件中添加"extern C"?

Jay*_*Jay 26 c c++

我最近发现了一些代码,其中extern"C"也被添加到源文件中以用于函数.它们也被添加到声明它们的头文件中.

我假设在头文件中添加'extern"C"就足够了.

应该在哪里添加extern"C"块?

更新:假设我正在使用CPP编译器编译我的C代码,并为头文件中的所有函数添加了外部"C"防护(即我的所有函数都在头文件中有原型),但在源文件中我没有添加相同的.这会导致问题吗?

Ada*_*wen 26

既然你的意思

extern "C" { ... }
Run Code Online (Sandbox Code Playgroud)

样式保护,这些声明一些函数是"C"链接,而不是"C++"链接(通常有一堆额外的名称装饰,以支持像重载函数之类的东西).

当然,目的是允许C++代码与C代码接口,C代码通常在库中.如果库的标题不是用C++编写的,那么它们就不会包含extern "C"C++的保护.

用C++编写的AC标题将包含一些内容

#ifdef __cplusplus
extern "C" {
#endif

...

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

确保C++程序看到正确的链接.但是,并非所有库都是用C++编写的,所以有时你必须这样做

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

使连接正确.如果头文件是由其他人提供的,那么改变它是不好的做法(因为那时你不能轻易更新它),所以最好用你自己的后卫(可能在你自己的头文件中)包装头文件.

extern "C" 不是(AFAIK)ANSI C,因此如果没有预处理器保护,则不能包含在普通C代码中.

为了回应您的编辑:

如果您使用的是C++编译器,并且在头文件中将函数声明为extern"C",则无需在实现文件中将该函数声明为extern"C".从C++标准的7.5节(强调我的):

如果同一函数或对象的两个声明指定了不同的链接规范(即,这些声明的链接规范指定了不同的字符串文字),如果声明出现在同一个转换单元中,则程序格式错误,并且如果声明出现在不同的翻译单元中,则适用一个定义规则.除了具有C++链接的函数之外,没有链接规范的函数声明不应位于该函数的第一个链接规范之前.在看到明确的链接规范之后,可以在没有链接规范的情况下声明函数; 前面声明中明确指定的链接不受此类函数声明的影响.

我不相信它是好的做法,因为链接规范可能会偶然发生分歧(例如,如果包含链接规范的头文件未包含在实现文件中).我认为最好在实现文件中明确.

  • 任何需要链接到当前编译单元之外的函数都必须声明正确的链接。对于静态函数(即只能在当前 c 文件中看到的函数)来说这并不重要,因为该函数不会导出,因此永远不需要链接到。 (2认同)
  • 我得到你指出的问题,因为“包含链接规范的头文件不包含在实现文件中”,所以我完全同意你的观点,最好在实现文件中显式添加 extern“C”,按照你保存的方式我花了很多时间,谢谢:) (2认同)

Pet*_*der 8

他们只需要进入其他源文件包含的任何内容.

随着一些成语,你会发现人,其中包括源文件.

  • 不幸的是,成语的链接被打破了.你有其他的替代链接吗? (5认同)

Geo*_*lly 5

它们应该添加到所有文件中,这些文件包含在其他文件中。

通常,一个不包括源文件。