- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
笔试复习·C
1 .C中调用C++代码
(1)对于C++中非类的成员函数,可以简单的在函数声明前面加extern “C”,通常函数声明位于头文件中,当然也可以将声明和函数定义一起放在cpp中,在没有声明的情况下,直接在定义前添加extern “C”也可
// C++ code:
extern C void f(int);
void f(int i)
{
// ...
}
然后,你可以这样使用 f():
/* C code: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}
(2)对于C++类的成员函数,则需要另外做一个cpp文件,将需要调用的函数进行包装。
// C++ code:
class C
{
// ...
virtual double f(int);
};
extern C double call_C_f(* p, int i) // wrapper function ,in cpp file
{
return p-f(i);
}
然后,你就可以这样调用 C::f():
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i); //函数中调用C++代码
/* ... */
}
如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:
// C++ code:
void f(int);
void f(double);
extern C void f_i(int i) { f(i); }
extern C void f_d(double d) { f(d); }
然后,你可以这样使用每个重载的 f():
/* C code: */
void f_i(int);
void f_d(double);
void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
2 C++中调用C代码
对于C中的函数代码,要么将C代码的头文件进行修改,在其被含入C++代码时在声明中加入extern “C”或者在C++代码中重新声明一下C函数,重新声明时添加上extern “C”头。
加extern “C”头一定是加在C++的代码文件中才能起作用的。
分析一下这个现象的实质原因:
C编译器编译函数时不带函数的类型信息,只包含函数符号名字,如C编译器把函数int a(float x)编译成类似_a这样的符号,C连接器只要找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern C的作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数(通常是把封装函数用C++编译器按C++方式编译,用了extern C 后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C调用C++了)。相反,C++调用C函数,extern C 的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是_a_float来找调用函数。extern C是连接申明(linkage declaration),被extern C修饰的变量和函数是按照C语言方式编译和连接的
注:如果你用VC6.0编译附件时遇到类似“fatal error C1010: unexpected end of file while looking for precompiled header directive”报错的话,请将bb.c文件做如下处理右键点击项目工程中的该文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头。
派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成
您可能关注的文档
- NE单选.doc
- sha-1算法.doc
- 1.2《时间和位移》A.ppt
- 三年级计算机复习题.doc
- 8251习题.ppt
- 位似A.ppt
- 第十五章VTP协议(下)选修.ppt
- 误码.ppt
- SDH指针.ppt
- 单片机实验2-多字节加法.ppt
- 2025年氯系漂白助剂项目规划申请报告.docx
- 2025年vb程序设计试题及答案.doc
- 2025年党史知识竞赛试题及答案.doc
- 2025年秘密花园测试题及答案.doc
- 解析卷-苏科版九年级物理上册《机械能和内能》综合测评试卷(含答案详解版).docx
- 难点解析-苏科版九年级物理上册《机械能和内能》难点解析试题(含解析).docx
- 考点解析-苏科版九年级物理上册《机械能和内能》综合练习练习题(含答案详解).docx
- 考点解析苏科版九年级物理上册《机械能和内能》专题测评试卷(含答案详解版).docx
- 苏科版九年级物理上册《机械能和内能》定向攻克试题(含详解).docx
- 2025年河北省邢台市行政职业能力测验模拟试题及参考答案.docx
文档评论(0)