extern "C" 的含义:????实现C++与C及其他语言的混合编程

C++中extern "C"的设立动机是实现C++与C及其他语言的混合编程。

C++为了支持函数的重载。C++对全局函数的处理方式与C有明显的不同。

对于函数void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo。而C++编译器则会产生像_foo_int_int之类的名字。

extern是C/C++语言中表明函数和全局变量作用范围(可见性)的keyword。该keyword告诉编译器。其声明的函数和变量能够在本模块或其他模块中使用。

  通常。在模块的头文件里对本模块提供给其他模块引用的函数和全局变量以keywordextern声明。

比如,假设模块B欲引用该模块A中定义的全局变量和函数时仅仅需包括模块A的头文件就可以。这样,模块B中调用模块A中的函数时,在编译阶段,模块B尽管找不到该函数。可是并不会报错。它会在连接阶段中从模块A编译生成的目标代码中找到此函数。

  与extern相应的keyword是static。被它修饰的全局变量和函数仅仅能在本模块中使用。因此,一个函数或变量仅仅可能被本模块使用时,其不可能被extern “C”修饰。

  被extern "C"修饰的变量和函数是依照C语言方式编译和连接的。

比如:如果在C++中:

// 模块A头文件 moduleA.h

int foo( int x, int y );

在模块B中引用该函数:

// moduleB.cpp

#include "moduleA.h"

foo(2,3);

  实际上,在连接阶段。连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这种符号!

加extern "C"声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h

extern "C" int foo( int x, int y );

在模块B的实现文件里仍然调用foo( 2,3 ),其结果是:

  (1)模块A编译生成foo的目标代码时。没有对其名字进行特殊处理,採用了C语言的方式;

  (2)连接器在为模块B的目标代码寻找foo(2,3)调用时。寻找的是未经改动的符号名_foo。

  假设在模块A中函数声明了foo为extern "C"类型,而模块B中包括的是extern int foo( int x, int y ) 。则模块B找不到模块A中的函数;反之亦然。

在C语言的头文件里,对其外部函数仅仅能指定为extern类型。C语言中不支持extern "C"声明。在.c文件里包括了extern "C"时会出现编译语法错误。在C中引用C++语言中的函数和变量时。C++的头文件需加入extern "C",可是在C语言中不能直接引用声明了extern "C"的该头文件。应该仅将C文件里将C++中定义的extern "C"函数声明为extern类型。比如:

//C++头文件 a.h

extern "C" int foo( int x, int y );

//C++实现文件 a.cpp

#include "a.h"

int foo( int x, int y ){return x + y;}

/* C实现文件 b.c

这样会编译出错:#include "a.h" */

extern int foo( int x, int y );

int main( int argc, char* argv[] ){

foo( 2, 3 );

return 0;

}

时间: 2024-10-12 13:29:32

extern "C" 的含义:????实现C++与C及其他语言的混合编程的相关文章

extern "C" 的含义:????实现C++与C及其它语言的混合编程

C++中extern "C"的设立动机是实现C++与C及其它语言的混合编程. C++为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.对于函数void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字. extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. 通常,在模块的头文件中对本

无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。

什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式.它还指定了用于排序和比较字符的规则.排序规则具有下面的特征: 语言 区分大小写 区分重音 区分假名 比如在SQL Server 20

Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法

非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800CCC0F等等,无法接收邮件. 主要是因为您安装了杀毒软件或者防火墙,而且开启了“发送和接收的邮件进行扫描”选项,所以杀毒这些软件阻挡.误诊断时,或者网速不稳定时可能就会出现此类报错,会把110(POP3)接收邮件port给关闭了. 解决方法: 关闭杀毒软件电子邮件扫描监控功能: 1.在杀毒软件的‘

phpcms v9中 action="position" 和action="lists"有什么差别, 以及action 的属性和值

action值的含义: lists 内容数据(文章?)列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 position 内容推荐位列表

jquery版本号升级不兼容的问题:$("input").attr("value")功能发生改变

之前项目中使用的是jquery-1.6.3.js,在这个版本号中,假设我们想获取输入框的值,能够使用$("input").attr("value")或者是$("input").val(),这2种方式是等价的. <input type="text" id="speed" /> $("#speed").attr("value"); $("#speed

玩转JPA(一)---异常:Repeated column in mapping for entity/should be mapped with insert=&amp;quot;false&amp;quot; update=&amp;quot;fal

近期用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: org_id (should be mapped with insert="false" update="false") 这个错误是由实体类引起的.我一開始是这样写的: @Column private long orgId; @ManyToOne @JoinColumn

asm volatile (&amp;quot;B .&amp;quot;)

在开发中,我们常常会有有这种需求,就是在某段代码处開始,一步一步往下跟踪调试,有人说加个while(1)循环,事实上这个循环增加后,其后边的代码就会被优化掉,达不到我们的目的,更好的办法是在须要的地方插入一句汇编: asm volatile ("B .");这样,不仅其后边的代码不会被编译器优化掉.还达到了我们跟踪调试代码的目的.

Linux Sed命令具体解释+怎样替换换行符&amp;quot;\n&amp;quot;(非常多面试问道)

Sed Sed是一个强大的文本处理工具 能够採用正则匹配.对文本进行插入删除改动等操作 Sed处理的时候,一次处理一行,每一次把当前处理的存放在暂时缓冲区.处理完后输出缓冲区内容到屏幕,然后把下一行读入缓冲区,如此反复,直到结尾. 1.命令格式和參数 sed [-nefr] [动作] 文件 參数: -n 安静模式.在sed处理的时候.全部来自STDIN的数据都会被输出到终端.加上-n会仅仅输出处理的哪行 -e 直接在命令列上进行sed动作编辑 -f 直接将sed的动作写在文件内 -r sed动作

checkbox的attr(&amp;quot;checked&amp;quot;)一直以来,undefined问题解决

最近,屌丝要项目开发的需要,需要一个完整的选checkbox特征. 该死的~~这不是很easy什么东西,共checkbox,N多个子的checkbox,总checkbox一旦选定,儿checkbox所有选择,一旦总未选中.儿子也没有选择. 这个小需求,本屌丝一阵窃喜,多么简单的功能啊,OK,两分钟完事~~~ 时间一分一秒的过去,本屌丝内心奔腾的草原的马儿,从一直逐渐添加到了千万仅仅~~~ 这尼玛怎么回事? alert($("#checkbox_all").attr("chec