C和C++格式转换
一、引用参数和指针的转换
标准C不支持引用参数,对此需进行转换。下面以bo1-1.cpp和bo1-1.c中DestroyTriplet()函数为例来说明这种转换。
bo1-1.cpp中含有引用参数的函数如下:
Status DestroyTriplet(Triplet &T) {
// 操作结果:三元组T被销毁
free(T);
T=NULL;
return OK;
}
转换后在bo1-1.c中的标准C程序如下:
Status DestroyTriplet(Triplet *T) /* 将&T改为*T */
{ /* 操作结果:三元组T被销毁*/
free(*T); /* 将T改为*T */
*T=NULL; /* 将T改为*T */
return OK;
}
对照以上2个函数可见:将C++函数形参表中以&打头的参数改成以*打头的参数,再在函数中该参数前加*即可。
要注意的是,在这两个函数中,形参的类型是不同的。在bo1-1.cpp中,T的类型是Triplet;在bo1-1.c 中,T的类型是Triplet的指针。
但为方便起见,没有改写C程序中的注释。另外,在标准C程序中调用该函数,实参前应加&。
如main1-1.cpp中调用DestroyTriplet()的语句为
DestroyTriplet(T);
相应的标准C程序main1-1.c 中调用DestroyTriplet()的语句为
DestroyTriplet(&T);
其中,在调用DestroyTriplet()的两程序中,两实参T的类型是相同的。
另外,在转换过程中,遇到&*或*&可“抵消”,即将*&T转换为T。
二、标准C在指明所定义的结构体或枚举类型时,在类型前要加strutc或enum,而C++则不必加
如在C++的c2-1.h中定义结构体SqList如下:
struct SqList {
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
C++在指明变量或形参的类型时,只需用SqList即可。如bo2-1.cpp中的一个函数如下:
int ListLength(SqList L) {
// 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}
如果在标准C程序中像C++的c2-1.h那样定义变量L的类型,则在bo2-1.c中该函数应如下:
int ListLength(struct SqList L) {
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
return L.length;
}
说明变量L时要用struct SqList。当用到某个结构体就要在其类型前加struct,用到某个枚举类型就要在其类型前加enum是很麻烦的。
为了方便起见,可用typedef定义类型。在标准C程序的c2-1.h中定义SqList如下:
typedef struct {
ElemType *elem; /* 存储空间基址*/
int length; /* 当前长度*/
int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
}SqList;
这样,在bo2-1.c中相应的函数为
int ListLength(SqList L) {
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
return L.length;
}
这个函数与bo2-1.cpp 很相似。可见,只要在定义结构体时使用typedef,则在指明结构体的类型时就不必加struct。
标准C都采用这种方法定义结构体。定义枚举类型时使用typedef 的方法与此类似。
三、标准C的共用体必须有变量名,而C++可以省略
如在c5-6.h(C++)中定义GLNode1如下:
// c5-6.h 广义表的扩展线性链表存储结构
enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表
typedef struct GLNode1 {
ElemTag tag; // 公共部分,用于区分原子结点和表结点
union // 原子结点和表结点的联合部分
{
AtomType atom; // 原子结点的值域
GLNode1 *hp; // 表结点的表头指针
};
GLNode1 *tp; // 相当于线性链表的next,指向下一个元素结点
}*GList1,GLNode1; // 广义表类型GList1是一种扩展的线性链表
注意:其中的共用体没有变量名。在bo5-6.cpp 中的函数GListEmpty()如下:
Status GListEmpty(GList1 L) {
// 初始条件:广义表L存在。操作结果:判定广义表L是否为空
if(!L||L->tag==LIST&&!L->hp)
return OK;
else
return ERROR;
}
而标准C的c5-6.h如下:
/* c5-6.h 广义表的扩展线性链表存储结构*/
typedef enum{ATOM,LIST}ElemTag; /* ATOM==0:原子,LIST==1:子表*/
typedef struct GLNode1 {
ElemTag tag; /* 公共部分,用于区分原子结点和表结点*/
union /* 原子结点和表结点的联合部分*/
{
AtomType atom; /* 原子结点的值域*/
struct GLNode1 *hp; /* 表结点的表头指针*/
}a;
struct GLNode1 *tp; /* 相当于线性链表的next,指向下一个元素结点*/
}*GList1,GLNode1; /* 广义表类型GList1是一种扩展的线性链表*/
它内部的共用体必须有变量名。在bo5-6.c 的函数GListEmpty()中也变动如下:
Status GListEmpty(GList1 L) {
/* 初始条件:广义表L存在。操作结果:判定广义表L是否为空*/
if(!L||L->tag==LIST&&!L->a.hp)
return OK;
else
return ERROR;
}
四、C++可重载
即在一个程序中,可有几个同名的函数同时存在。只要它们的形参个数或类型有所不同即可。
标准C不可重载。在C++转换成标准C时,必须将同名函数改为不同名。
如在bo9-2.cpp中有1个SearchBST()函数(算法9.5(b)),在bo9-2.cpp所包含的文件func9-1.cpp中也有1个SearchBST()函数(算法9.5(a)),但这两个同名函数的形参个数不同。
C++根据函数的形参个数可分辨所调用的是哪个函数。而标准C没有这个能力,所以把bo9-2.c中的SearchBST()函数改为SearchBST1()函数。
五、C++允许在执行语句中变量使用之前定义变量
如algo8-1.cpp 中的PrintUser()函数:
void PrintUser(Space p[]) {
// 输出p数组所指的已分配空间
for(int i=;i<MAX/e;i++)
if(p[i]) // 指针不为0(指向一个占用块) {
printf("块%d的首地址=%u ",i,p[i]); // 输出结点信息
printf("块的大小=%d 块头标志=%d(0:空闲1:占用)",p[i]->size,p[i]->tag);
printf(" 块尾标志=%d\n",(FootLoc(p[i]))->tag);
}
}
这种形式在标准C 语言中是不允许的。相应的algo8-1.c 中的PrintUser()函数为:
void PrintUser(Space p[]) {
/* 输出p数组所指的已分配空间*/
int i;
for(i=;i<MAX/e;i++)
if(p[i]) /* 指针不为0(指向一个占用块) */ {
printf("块%d的首地址=%u ",i,p[i]); /* 输出结点信息*/
printf("块的大小=%d 块头标志=%d(0:空闲1:占用)",p[i]->size,p[i]->tag);
printf(" 块尾标志=%d\n",(FootLoc(p[i]))->tag);
}
}
六、C++允许在转换类型时采用函数的形式
如algo8-2.cpp中AllocBuddy()函数的,一条语句如下:
pi=pa+int(pow(,k-i));
而在标准C程序algo8-2.c中必须改为以下形式(注意带下划线部分):
pi=pa+(int)pow(,k-i);
七、在C++中可用new申请空间
如bo8-1.cpp 中主函数main()的一条语句如下:
p=new WORD[MAX+]; // 申请大小为MAX*sizeof(WORD)个字节的空间
在标准C的bo8-1.c中要改为
p=(WORD*)malloc((MAX+)*sizeof(WORD)); /* 申请大小为MAX*sizeof(WORD)个字节的空间*/
八、在C++中可用cout和cin做输入输出语句
它们的好处是不必给出格式符。这样,当变量的类型发生变化时,不必修改语句。但在main1-1.c 中必须改为
printf("%d %d %d\n",T[],T[],T[]);/*当ElemType的类型变化时,要相应改变printf()的格式符*/
九、在C++中“//”后到本行末的内容为注释,而标准C的注释必须放在“/*”、“*/”之间
十、标准C 程序的扩展名为.c,C++程序的扩展名为.cpp
定义数据存储结构的文件,其扩展名是.h,在两种语言中不能混用。
C和C++格式转换的更多相关文章
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- 【视频处理】YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- 日期格式转换 java 2016-09-03T00:00:00.000+08:00
/** * 日期格式转换yyyy-MM-dd'T'HH:mm:ss.SSSXXX (yyyy-MM-dd'T'HH:mm:ss.SSSZ) TO yyyy-MM-dd HH:mm:ss * @ ...
- RSA密钥之C#格式与Java格式转换
前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- Oracle日期格式转换,tochar(),todate()
Oracle日期格式转换 本文主要介绍Oracle中的日期转换. 1. 日期转化为字符串 (以2016年10月20日为例) select to_char(sysdate,'yyyy-mm-dd hh2 ...
- C#返回时间格式转换成 js 字符串
在.net 中,调用 post 或者 get和后台通信时,如果有时间返回信息,后台返回的时间信息一般是这样格式:Thu Jul 9 23:14:53 UTC+0800 2015,那么要在前台显示就会有 ...
- SpringMVC与MyBatis整合之日期格式转换
在上一篇博客<SpringMVC与MyBatis整合(一)——查询人员列表>中遗留了日期格式转换的问题,在这篇记录解决过程. 对于controller形参中pojo对象,如果属性中有日期类 ...
- JAVA,NET RSA密钥格式转换
JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...
- JS时间格式 GMT格式转换
JavaScript时间格式转换总结 1.当前系统区域设置格式(toLocaleDateString和toLocaleTimeString) 例子:(new Date()).toLocaleDateS ...
随机推荐
- Jmeter正则表达式提取器--将上一个请求的结果作为下一个请求的参数
正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用 1.首先在线程组下添加两个HTTP请求, 2.添加好两个HTTP请求后,在每个HTT ...
- 线段树【 bzoj3132 】【p4145 】上帝造题的七分钟2 / 花神游历各国
题目大意 给定一个区间 支持开方和查询区间值操作 (多组数据 分析 如果一个区间的最大值小于1,那就没有开方的必要了(具体不会证明,听大佬讲的 一个数经过多次开方就会变成1(可以用计算器试一下 因此我 ...
- WSS3SDK之:服务器和站点架构:对象模型概览
源出处:http://www.cnblogs.com/Sunmoonfire/archive/2011/01/18/1937884.html Windows SharePoint Services提供 ...
- Map泛型集合-输入名字输出成绩
package collection; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import ...
- 【OpenJudge3531】【背包DP】【膜法交配律】判断整除
判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+ ...
- Java 继承问题 -- 子类是否继承父类的私有属性
理解一: 子类会继承父类的所有属性和方法,至于能不能直接访问,那就是访问权限的问题了. 例如:父类有个private String name; 属性.子类会继承下来,但子类访问不了,因为是privat ...
- [置顶]
kubernetes资源类型--secret和Service Account
secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...
- python2 to3
http://blog.csdn.net/zhzh213/article/details/53842790 有个内部工具叫做2to3.py位置在Python3/tool/script文件夹. 首先CD ...
- ECSHOP生成缩略图模糊
原因是因为ECSHOP生成缩略图时,用到的函数 imagejpeg() 没有设置质量参数.注释:质量参数为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大).如果没有设置质量参 ...
- Centos 6安装 Jenkins
前言 持续集成的概念 持续集成,Continuous integration ,简称CI. 持续集成正是针对这一类问题的一种软件开发实践.它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多 ...