为什么c++里ungetc防止函数被编译器优化会编译不通过

2009年8月 C/C++大版内专家分月排行榜第三2009年7月 C/C++大版内专家分月排行榜第三2009年2月 C/C++大版内专家分月排行榜第三
2009年8月 C/C++大版内专家分月排行榜第三2009年7月 C/C++大版内专家分月排行榜第三2009年2月 C/C++大版内专家分月排行榜第三
2009年8月 C/C++大版内专家分月排行榜第三2009年7月 C/C++大版内专家分月排行榜第三2009年2月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。在c++程序中调用被c 编译器编译后的函数,为什么要加extern &c_百度知道
在c++程序中调用被c 编译器编译后的函数,为什么要加extern &c
我有更好的答案
找不到就直接报错。C++的函数名和外部变量的名字修饰并没有一个标准;C& 表示按照C语言方式进行连接?f@@YAXXZC语言编译器:_f这两个是完全不同的符号,连接器在链接的时候会根据编译器给的符号名到其他模块进行查找和解析,所以即便是编译好的C++的代码要想跨C++编译器使用也是很困难的,而C语言的函数调用约定和函数名修饰比较规范,所以操作系统的API一般都是针对C语言的。你如果不加会出现连接错误(XX函数未定义);之后,C++编译器就会按照C语言的符号修饰规则对函数进行修饰,这样连接器就能够正确解析,因为C++语言和C语言对编译后的函数符号和外部变量符号的修饰方式不一样,不同的编译器都有各种的修饰规则extern &quot。举个例子: 下面的一个函数分别用C语言编译器和VC++编译器进行编译:void f() {}编译过后得到的函数符号为:VC++编译器:,代码编译过后,连接器解析外部符号的时候就会出现无法解析外部符号的错误。你加上extern &C&quot
采纳率:68%
来自团队:
为您推荐:
其他类似问题
extern的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?_百度知道
在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
int y)答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言的不同。假设某个函数的原型为;该函数被C 编译器编译后在库中的名字为_foo , 而C++ 编译器则会产生像_foo_int_int 之类的名字: void foo(int x
我有更好的答案
因为C++编译函数时函数名会自动修改(为函数重载这些技术服务)而C语言不会你再自己想一下就明白了。
采纳率:49%
而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同; 其它C头文件}这就告诉C++编译译器,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern“C”来解决这个问题。例如:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,该怎么办?假设某个C函数的声明如下如果C++程序要调用已经被编译后的C函数。C++编译器开发商已经对C标准库的头文件作了extern“C”处理; 其它函数}或者写成extern “C”{
#include “myheader.h”
… /&#47:extern “C”{
void foo(int x, int y);
… /&#47,所以我们可以用#include 直接引用这些头文件,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int
参考资料:
高质量程序设计指南(林锐)
本回答被提问者采纳
这个是编译器的问题
为您推荐:
其他类似问题
extern的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(571)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081071',
blogTitle:'常用C头文件及其在标准C++中的保留',
blogAbstract:'&\r\n头文件的作用\r\n早期的编程语言如Basic、Fortran 没有头文件的概念,C++/C 语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件的作用略作解释:\r\n(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。\r\n(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'-1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}博客访问: 1458387
博文数量: 266
博客积分: 1305
博客等级: 军士长
技术积分: 4662
注册时间:
不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。
欢迎关注微信公众号:菜鸟的机器学习
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
& & 常见的不能被声明为虚函数的有:普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数、友元函数。
1、为什么C++不支持普通函数为虚函数?
& & 普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时绑定函数。
2、为什么C++不支持构造函数为虚函数?
& & 这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完成了解细节的情况下也能正确的处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。
3、为什么C++不支持内联成员函数为虚函数?
& & 其实很简单,内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。inline函数在编译时被展开,虚函数在运行时才能动态的绑定函数。
4、为什么C++不支持静态成员函数为虚函数?
& & 如果一个函数定义为虚函数,那么它是为了实现动态绑定的,在派生类中可以override,这与静态成员函数的语义的矛盾的。
5、为什么C++不支持友元函数为虚函数?
& & 因为C++不支持友元函数的继承。
& & (1)顶层函数:多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层函数不属于成员函数,是不能被继承的。
& & (2)构造函数:构造函数不能被继承,因而不能声明为virtual函数;构造函数一般是用来初始化对象,只有在一个对象生成之后,才能发挥多态的作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,这是行不通的。如下例所示。
#include <iostream>
using namespace std;
&&&&virtual void show()
&&&&&&&&cout<<"***"<<endl;
class D:public B
&&&&void show()
&&&&&&&&cout<<"==="<<endl;
int main(void)
&&&&B *pb;
&&&&D d;&&&&&&&&//先生成对象
&&&&pb=&d;
&&&&pb->show(); //再体现多态
&&&&pb=new D(); //先调用构造函数
&&&&pb->show(); //再多态
&&&&delete pb;
&&&&return 0;
& & (3)static函数:不能被继承,只属于该类,没有this指针。
& & (4)友元函数:友元函数不属于类的成员函数,不能被继承。
& & (5)inline函数:inline函数和virtual函数有着本质的区别:inline函数是在程序被编译时展开的,在函数调用处用整个函数体去替换;virtual函数在运行时才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。此外,一切virtual函数都不可能是inline函数。
& & 引用:
阅读(1659) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 编译原理 scan函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信