外部链接和"外部"C""块
External linkage and »extern "C"« block
我有一个int ID
,我想在c++中定义它,并使其可用于C链接(为了简单起见,人为的大小写):
/* i.h */
#ifdef __cplusplus
extern "C" {
#endif
extern int ID;
#ifdef __cplusplus
}
#endif
下面是一个使用int
的C和c++程序:
/* m.cpp */
#include "i.h"
#include <iostream>
int main() { std::cout << ID << std::endl; }
/* m.c */
#include "i.h"
#include <stdio.h>
int main() { printf("%dn", ID); }
现在我想知道的是extern "C"
和/或extern
的语法。以下是int ID
的定义:
/* i.cpp */
// const int ID = 88; // no C linkage, obviously, LNK2019/1120
// extern "C" const int ID = 88; // provides C linkage
// extern "C" { const int ID = 88; } // no C linkage, surprisingly, LNK2019/1120
// extern "C" { extern const int ID = 88; } // C linkage restored
编译:cl /nologo /W4 m.cpp i.cpp /MD /EHsc
cl /nologo /W4 m.c i.cpp /MD
我不明白的是当extern "C"
与{block}
一起使用时的语法。我必须重复extern
,而对于extern "C"
的无块形式,我不这样做。这只是语法上的怪癖,还是另有隐情?
我在Dale Rogerson的Inside COM的第98页偶然发现了这个问题。有一个代码清单与嵌套的extern
和注释旨在澄清(但我不明白):
#include <objbase.h>
extern "C"{
extern const IID IID_IX = {0x32bb8320, 0x41b, 0x11cf, ...};
// The extern is required to allocate memory for C++ constants.
}
谁能解释一下内部的extern
?
内部的extern
意味着所期望的:"该符号是在其他地方定义的,它有外部链接,不要在本单元中为它分配空间(除非这里也定义了)"。
外部extern "C" { ... }
可能有点误导语法,它只告诉编译器"如果您在此块内创建具有外部链接的任何符号的名称,请使用传统的C命名(C语言链接)而不是c++名称混淆( c++语言链接)"。但是它没有指定块内的所有内容都"在其他地方定义"(具有外部链接)——它们仍然使用默认的内部链接声明。这就是为什么你也需要内部的extern
。
单行变量extern "C" <variable declaration>
只是一个简写,因为如果您关心它的跨单位符号名,可能需要定义一个外部变量。
(作为旁注,我将i.h
也包括在i.cpp
中,这样我就不必在实现中记住与extern "C"
混淆了。)
问题是const
和extern
相互交战。const
意味着(除其他事项外),"使此定义成为内部的,除非在其上有显式的extern
。"当定义在extern "C"
块中时,没有extern
直接在定义上,因此来自const
的"隐式内部"优先。其他定义都直接在定义上有一个extern
,所以它变成了外部的。
int ID可以和不可以这样定义:
小心!extern "C"
在不同的上下文中有不同的效果。
N3797§7.5/7:
直接包含在链接规范中的声明将被处理就好像它包含
extern
说明符(7.1.1)用于确定声明的名称的链接以及它是否为定义。这样的声明不能指定存储类。extern "C" int i; // declaration extern "C" { int i; // definition }
所以你的代码片段中的第二行只是一个声明,而你的第三行也是一个定义。这改变了链接规范对声明的影响-您不能给出在c++翻译单元C链接中定义的名称。
- 未解决的外部链接问题
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 内联函数/变量的外部链接
- 模板外部链接不起作用
- 字符串文本不能有外部链接的原因是什么?
- 当用作模板参数时,功能指针是否需要指向具有外部链接的函数
- 链接在XLNT.TEST项目上失败,具有10个未经介绍的外部链接:
- C :将外部链接与未命名的名称空间使用常数变量
- C++外部链接
- 会员变量是否具有外部链接
- 为什么对非类型模板参数的引用需要外部链接
- VC glew外部链接错误
- Clang AST : 外部链接规范问题
- 何时使用外部链接初始化全局常量,避免静态初始化顺序惨败
- 类中的匿名结构,具有外部链接
- 带外部链接的便携式名称"typeof"
- 类型是否只有内部/外部链接以外的"链接"?
- 未命名命名空间中名称的外部链接
- 从QWebKit上托管的flash播放器打开外部链接
- C++函数中未解析的外部链接