有没有一个工具,能把c++代码,转换成c代码?

enisdle 2012-11-15 11:08:51
就是想看看,怎么通过c语言,来实现c++的功能。


C++的编译器,其实是不是先把C++代码进行语法等等的分析,转换成C代码,然后再对C代码进行编译,得出可执行的机器码?
...全文
4537 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
安全期已过 2013-06-09
  • 打赏
  • 举报
回复
讲到函数名重载的时候也是转换为C代码后 才发现 C++的函数名重载在C语言中只是换了几个相似的名字
安全期已过 2013-06-09
  • 打赏
  • 举报
回复 2
楼主 其实可以转成C代码的,记得我在学完C语言后 刚开始学C++的时候,老师把C++的helloworld程序转成C代码结果出现了九百多行的C代码,但是我不知道用的是什么工具,所以说C++是C的基础上建立起来的 C++的所有功能C都可以做只是代码量会很大很大。
pubhobo 2013-01-15
  • 打赏
  • 举报
回复
引用 20 楼 tomsoft 的回复:
引用 18 楼 dahuaixiaohuai 的回复:引用 4 楼 enisdle 的回复:为什么没有这样的代码? 难道C++能做的某些东西,C语言实现不了? 引用 1 楼 turingo 的回复: 没有这样的工具。 C++实现的一些特性,C当然实现不了。 C++所有的特性C都可以实现,事实上C与C++的区别仅仅是在虚函数,如果不考虑虚函数,C/C+……
c++的模板递归 ,请问用c如何实现?
赵4老师 2013-01-15
  • 打赏
  • 举报
回复
c++的模板递归 ,c用code generation技术实现。
weikaty 2013-01-15
  • 打赏
  • 举报
回复
C++ 本来就兼容C ,为啥子还要转?
pp0354030 2013-01-14
  • 打赏
  • 举报
回复
答案在2楼!
jdwx 2013-01-14
  • 打赏
  • 举报
回复
引用 42 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
FrankHB1989 2013-01-14
  • 打赏
  • 举报
回复
引用 36 楼 tomsoft 的回复:
引用 31 楼 MagiSu 的回复:引用 22 楼 tomsoft 的回复:引用 17 楼 MagiSu 的回复:C++独立出来好像是因为异常抛出的问题吧。 try和catch实际只是两个宏,这个事实上与C++没有什么关系。 C++的优势无外乎就是继承多态什么的:这只是从高级语言角度来看 stop kidding 宏不可能做栈回退的动作的。 先汗一下,……
? 说笑呢?M$VC和g++自然都可以不用异常。于是这就足够说明C++的问题了? ISO C++都很不科学地直接正式定义了stack unwinding这种说法,就被你这么一句话带过? 至于41L说的,sjlj是可以,但没说一定就需要这么实现。有用dwarf的,有用SEH的……
「已注销」 2013-01-13
  • 打赏
  • 举报
回复
引用 39 楼 akirya 的回复:
引用 36 楼 tomsoft 的回复:1)try ... catch在某些情况下,如嵌入系统的gcc或类似的可以以宏的形式出现。这个与系统有关:在VC中try和catch我相信不会是以宏的形式出现----多数我是在嵌入平台上开发,没有顾忌更广泛的PC平台,可能引起误解了; 2)try ... catch需要堆栈回退吗?我刚反向了一个VC的代码,怎么没有看到特殊的堆栈操……
1)首先某些嵌入平台不允许异常确实见过。实际也是重新使用define定义TRY和CATCH,印象中是不是在GCC中定义 ---- 忘记了 2)在C中通过setjmp实现TRY和CATCH,实现细节没有研究,但确实看到过这样的例子
「已注销」 2013-01-13
  • 打赏
  • 举报
回复
引用 31 楼 MagiSu 的回复:
引用 22 楼 tomsoft 的回复:引用 17 楼 MagiSu 的回复:C++独立出来好像是因为异常抛出的问题吧。 try和catch实际只是两个宏,这个事实上与C++没有什么关系。 C++的优势无外乎就是继承多态什么的:这只是从高级语言角度来看 stop kidding 宏不可能做栈回退的动作的。
嗯今天在写一个非Windows的程序时碰巧看到了一个C的实现的TRY和CATCH(之前有看过忘掉了),这里有几个关键: 1)使用setjmp 2)TRY和CATCH是使用define定义的,其中CATCH实质就是一个else语句 程序有些繁琐,具体原理晚些时候再研究。不过在嵌入平台看到TRY个CATCH的实现应该不是第一次了。这个可能要仔细研究一下setjmp了 ---- 所以即使用C实现TRY和CATCH不是不可以 看来41楼是高手
zhcosin 2012-12-18
  • 打赏
  • 举报
回复 1
很简单,你把 D.M.Ritchie 和 Bjarne Stroustrup 请到一起,然后告诉他们你的需求,再说一大堆好话,说不定他俩会免费给你写一个的:-)
asdjy123 2012-12-18
  • 打赏
  • 举报
回复
学习 mark
赵4老师 2012-12-18
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
赵4老师 2012-12-18
  • 打赏
  • 举报
回复
C++只是一种面向对象的编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
mLee79 2012-12-18
  • 打赏
  • 举报
回复
try catch 是 setjmp/longjmp 模块化的马甲. 比如gcc中 throw --> _Unwind_RaiseException , C++要做的杂事情太多. C的 longjmp 就简单多了, setjmp 里设置个 sigmask , longjmp 里raise个signal就可以了... 这些东西转成C没法看.
乔巴好萌 2012-12-17
  • 打赏
  • 举报
回复
没有这样的工具吧 c++词法分析、语法分析的产出结果不是c文件
  • 打赏
  • 举报
回复
引用 36 楼 tomsoft 的回复:
1)try ... catch在某些情况下,如嵌入系统的gcc或类似的可以以宏的形式出现。这个与系统有关:在VC中try和catch我相信不会是以宏的形式出现----多数我是在嵌入平台上开发,没有顾忌更广泛的PC平台,可能引起误解了; 2)try ... catch需要堆栈回退吗?我刚反向了一个VC的代码,怎么没有看到特殊的堆栈操作? 这个请高手拿出实例来。
就算是gcc不可用弄宏模拟出来的。 a调用b b调用c。c中抛出异常,那么b中构造的对象也会析构。 funC可能是任何函数(使用函数指针,运行时动态改变),那么如何保证 funcC中抛出的异常后把funcB中的对象析构了。并且不执行funcB中的其他代码? 我倒是听说某些嵌入式平台根本不允许异常。
class test
{
public:
	~test()
	{
		puts( "test::~test" );
	}
};


void funcC()
{
	throw 1;
};

void funcB()
{
	test x;
	funcC();
	puts("funcB");
}
void funcA()
{
	try{
		funcB();
	}
	catch( ... )
	{
		
	}
}


int main(int argc, char *argv[])
{
	funcA();
    return 0;
}
fkseraph 2012-12-17
  • 打赏
  • 举报
回复
有应该是有的,但是没那必要 。毕竟术业有专攻嘛
MagiSu 2012-12-17
  • 打赏
  • 举报
回复
引用 36 楼 tomsoft 的回复:
引用 31 楼 MagiSu 的回复:引用 22 楼 tomsoft 的回复:引用 17 楼 MagiSu 的回复:C++独立出来好像是因为异常抛出的问题吧。 try和catch实际只是两个宏,这个事实上与C++没有什么关系。 C++的优势无外乎就是继承多态什么的:这只是从高级语言角度来看 stop kidding 宏不可能做栈回退的动作的。 先汗一下,……
linux下的gcc有这个操作。你可以试试。会有stack rewind。trycatch需要回退来保证回到合适的frame
「已注销」 2012-11-19
  • 打赏
  • 举报
回复
引用 31 楼 MagiSu 的回复:
引用 22 楼 tomsoft 的回复:引用 17 楼 MagiSu 的回复:C++独立出来好像是因为异常抛出的问题吧。 try和catch实际只是两个宏,这个事实上与C++没有什么关系。 C++的优势无外乎就是继承多态什么的:这只是从高级语言角度来看 stop kidding 宏不可能做栈回退的动作的。
先汗一下,应该是我的表述有问题: 1)try ... catch在某些情况下,如嵌入系统的gcc或类似的可以以宏的形式出现。这个与系统有关:在VC中try和catch我相信不会是以宏的形式出现----多数我是在嵌入平台上开发,没有顾忌更广泛的PC平台,可能引起误解了; 2)try ... catch需要堆栈回退吗?我刚反向了一个VC的代码,怎么没有看到特殊的堆栈操作? 这个请高手拿出实例来。
加载更多回复(35)

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧