Chinaunix

标题: C代码转成C++有什么要注意的? [打印本页]

作者: Dannysd    时间: 2015-09-02 14:54
标题: C代码转成C++有什么要注意的?
请大神们指导

现需要把一小部分C代码转成C++和别人的结合,对C++不太熟,勉强能看得懂,语法没什么问题

不知道其它有什么要注意的地方没有?

一直没写过C++ 。。。。。好紧张,怎么办
作者: bruceteen    时间: 2015-09-02 14:58
不长的话,就贴出来看看
作者: fender0107401    时间: 2015-09-02 15:01
转成C++是个什么概念啊。
作者: Dannysd    时间: 2015-09-02 15:04
回复 2# bruceteen


    17个源文件,平均一个7~800行吧,不太方便贴
作者: Dannysd    时间: 2015-09-02 15:05
回复 3# fender0107401


    就是源来是用C写的,现在要改成C++的,为了和别人的C++代码结合使用
作者: folklore    时间: 2015-09-02 15:08
回复 5# Dannysd


    这么多, 还是直接用C吧。。反正C++可以直接用C啊。
作者: zyla    时间: 2015-09-02 15:09
没必要转。
如果你需要支持c++的stl的话。。。
直接重载不就行了
作者: sxcong    时间: 2015-09-02 15:13
把文件从.c改成.cpp,自己先编译一下,简单错误自己先改掉。
比如,有些老的c程序,会把new当成变量用。
然后再集成到c++一起。
作者: Dannysd    时间: 2015-09-02 15:47
回复 7# zyla


    谢谢回复,那我先问问有没有用到STL库
作者: Dannysd    时间: 2015-09-02 15:48
回复 8# sxcong


    谢谢sxcong回复,这个方法看起来快很多啊,试试
作者: windoze    时间: 2015-09-02 21:14
本帖最后由 windoze 于 2015-09-02 21:17 编辑

在头文件两头加上点东西:


  1. #ifndef XXX_H
  2. #define XXX_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. // 原有的头文件内容

  7. #ifdef __cplusplus
  8. }
  9. #endif

  10. #endif  // XXX_H
复制代码
然后把所有编译不过去的地方改对就差不多了。
源代码不用动,不用改成cpp文件,也不需要用c++/g++编译,用cc/gcc就行,一样生成.o,一样link。

话说C++扛了那么多历史包袱不就是为了这个么……
作者: Dannysd    时间: 2015-09-02 21:35
回复 11# windoze


    谢谢windoze猫老大回复

    你这方法肯定不行,这相当于蒙混过关啊,要是着急发版估计还能蒙事,哈哈

   领导说改成C++的好维护,我也只能硬头皮改了

    不过真没觉得C有什么难维护的,感觉难维护大多是因为设计缺陷(混乱)造成的啊

   
作者: windoze    时间: 2015-09-02 22:15
回复 12# Dannysd

这不是蒙混过关啊,这就是标准的C和C++混编的方式啊。加上extern "C"可以防止里面的函数name mangling。

你自己去看看,系统中差不多所有的C头文件前后都有这个东西,就是为了让C++程序include的。

   
作者: MMMIX    时间: 2015-09-02 22:20
回复 13# windoze


    问题是人家不是想要 C/C++ 混合编程,而是想要只用 C++。
作者: MMMIX    时间: 2015-09-02 22:27
回复 13# windoze


    问题是人家不是想要 C/C++ 混合编程,而是想要只用 C++。
作者: windoze    时间: 2015-09-02 22:48
回复 15# MMMIX

lz不是需要把一些C代码和C++“结合”起来么,转成C++固然是一种做法,直接混编也是一种做法么。
作者: shang2010    时间: 2015-09-03 07:24
代价最省,当然是混合编译

cpp本来就是兼容的
作者: Dannysd    时间: 2015-09-03 14:37
回复 13# windoze


    谢谢windoze猫老大回复

    我再查查了解下,对C和C++混合还没什么了解
作者: Dannysd    时间: 2015-09-03 14:39
回复 15# MMMIX


    我觉得公司要求是这个意思,要我把用到的公共函数,放到原来的基类中,各个处理模块再做成单独的类实现
作者: Dannysd    时间: 2015-09-03 14:40
回复 17# shang2010


    谢谢shang2010回复


    C/C++混合肯定是最省时间的,而且改动也非常小
作者: hanzhenlll    时间: 2015-09-06 12:41
你需要做的就是封装, 将原来的C接口 封装成    __cplusplus 的标准接口,并适当的增加可扩展性,同时使用g++编译通过。



作者: foolishx    时间: 2015-09-07 11:43
说说我个人的理解哈:

     这应该是典型的设计模式应用场景了。一般对于老的代码,很多模式可以使用来一起工作,最典型的就是适配器模式。把所有的C语言的程序接口都抽象成适配器类的方法,并原样实现即可。其后所有调用原来C接口的地方改成适配器实例的对应方法就好了。做起来不难,就是有一定的工作量的。最主要的是你得对C++面向对象有一定的理解才行,光会语法只能说明你懂C
作者: yulihua49    时间: 2015-09-07 16:10
本帖最后由 yulihua49 于 2015-09-07 16:14 编辑
Dannysd 发表于 2015-09-02 14:54
请大神们指导

现需要把一小部分C代码转成C++和别人的结合,对C++不太熟,勉强能看得懂,语法没什么问题
...

c++可以直接调用c过程:
#ifdef __cplusplus
extern "C" {
#endif

int dlq_add(dlq_node **queue,dlq_node *node);
dlq_node *dlq_get(dlq_node **queue);
void dlq_timeout_check(dlq_node **queue);
//删除节点,返回-1:错,0:没找到,1:删除
int dlq_del(dlq_node **queue,dlq_node *node);

int c_thread_init(int num);
int to_epoll(dlq_node *dlp,int op,int flg);
int to_ctpool(dlq_node *dlp);

int rqueue(dlq_node *dlq,int Dnode);
//in rq_util.c
int Qpoll_init(int num);
dlq_node *Q_get(void);
int Q_release(dlq_node *dlp);

int finish(dlq_node *dlp,int flg);
int setTx(dlq_node *dlp);
int server_recv(dlq_node *dlp);
int timeout_deal(dlq_node *dlp);
int rs_timeout(resource *rs);
void Qp_timeout_check(void);

#ifdef __cplusplus
}
#endif

我们都是C++和C混用的。C程序也不必改写。

作者: Dannysd    时间: 2015-09-07 16:34
谢谢foolishx,yulihua49,hanzhenlll回复

结贴了,千万别引起C和C++的世纪之战啊

感谢所有回复的大神,谢谢
作者: cokeboL    时间: 2015-09-07 17:46
设计模式都出来了。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2