我最近发现了一些代码,其中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++链接的函数之外,没有链接规范的函数声明不应位于该函数的第一个链接规范之前.在看到明确的链接规范之后,可以在没有链接规范的情况下声明函数; 前面声明中明确指定的链接不受此类函数声明的影响.
我不相信它是好的做法,因为链接规范可能会偶然发生分歧(例如,如果包含链接规范的头文件未包含在实现文件中).我认为最好在实现文件中明确.
| 归档时间: |
|
| 查看次数: |
20698 次 |
| 最近记录: |