注册
登录
C/C++
C ++中extern“ C”的作用是什么?
返回
C ++中extern“ C”的作用是什么?
作者:
狗头军师
发布时间:
2024-12-21 08:37:07 (13小时前)
extern “C”放入C ++代码到底能做什么?
例如:
extern "C" { void foo(); }
收藏
举报
3 条回复
1#
回复此人
狗头军师
|
2020-07-24 16-58
extern "C"使C ++中的函数名称具有C链接(编译器不会更改名称),以便客户端C代码可以使用仅包含函数声明的C兼容头文件链接(使用)函数。函数定义以二进制格式(由C ++编译器编译)包含,客户端C链接程序随后将使用C名称链接到该二进制文件。 由于C ++具有函数名的重载,而C没有,因此C ++编译器不能仅使用函数名作为链接的唯一ID,因此它通过添加有关参数的信息来破坏名称。AC编译器不需要处理名称,因为您不能在C中重载函数名称。当您声明函数extern "C"在C ++中具有链接时,C ++编译器不会在用于链接的名称中添加参数/参数类型信息。 众所周知,您可以extern "C"显式地指定与每个单独的声明/定义的链接,或使用一个块将一组声明/定义的序列分组以具有一定的链接: extern "C" void foo(int); extern "C" { void g(char); int i; } 如果您关心技术方面的问题,它们会在C ++ 03标准的7.5节中列出,此处是一个简短的摘要(着重于extern "C"): extern "C" 是链接规范 每个编译器都必须提供“ C”链接 链接规范应仅在命名空间范围内出现 所有函数类型,函数名称和变量名称都具有语言链接。 请参阅Richard的注释:只有具有外部链接的函数名称和变量名称才具有语言链接。 即使语言相同,具有不同语言链接的两个函数类型也是不同类型 链接规格嵌套,内部确定最终链接 extern "C" 被班级成员忽略 具有特定名称的函数最多可以具有“ C”链接(无论名称空间如何) extern "C"强制一个函数具有外部链接(不能使其静态) 参见Richard的评论:内部有效;这样声明的实体具有内部链接,因此没有语言链接 staticextern "C" 从C ++到其他语言定义的对象以及从其他语言到C ++定义的对象的链接是实现定义的,并且取决于语言。只有两种语言实现的对象布局策略足够相似时,才能实现这种链接
编辑
2#
回复此人
v-star*위위
|
2020-07-24 17-02
C标准将[]运算符定义如下: a[b] == *(a + b) 因此a[5]将评估为: *(a + 5) 并且5[a]将计算为: *(5 + a) a是指向数组第一个元素的指针。a[5]是距,与相同的5个元素的值,从小学数学我们知道它们是相等的(加法是可交换的)。a*(a + 5)
编辑
登录
后才能参与评论