没有合适的资源?快使用搜索试试~ 我知道了~
C++语言继承了很多C的特性,但又抛弃了C的一些不合适的东西,C程序要能在C++环境上(例如用g++编译c程序)编译通过,还需要做一些兼容性处理,本文介绍了C/C++兼容性程序设计的一些基本知识。
资源推荐
资源详情
资源评论
C/C++兼容性程序设计必读
况阳 2008-12
1. 标准 C++预定义了__cplusplus 宏,作为 C++编译器的标记,因此可以在以 C 标准书写但
却用 C++编译器进行编译的代码文件中显示指定代码以 C 方式编译和链接。典型的书写
方式如下:
#ifdef __cplusplus
extern “C”
{
#endif
//函数声明
#ifdef __cplusplus
}
#endif
2. 在 C++中,struct 声明方式与 C 的声明方式大不相同:C++中,当定义结构 struct A{ }时,
A 是一个类型符,等同于 C++的 class 名;而 C 中,A 仅被当作一个标签,并不会被当
作一个类型,也就是说:在 C++中,程序可以使用“A a;”来定义一个结构体 A 变量,
但在 C 中,这样做却是非法的,C 中只能使用 stuct A a 方式来声明。
3. 全局 const 变量如果没有加类型限制符(extern, static, auto),则它在 C 中被理解为 extern
类型,在 C++中被理解为 static 类型。示例如下:
//user_stat.c
//全局变量 g_iUserNum 在 C 编译环境中被理解为 extern const int g_maxUserAllow = 64;
//而在 C++编译环境中被理解为 static const int g_maxUserAllow;
const int g_maxUserAllow = 64;
int getMaxUserNum()
{
return g_maxUserAllow;
}
这就致使在 C++中,如果两个文件中都定义了 const 全局变量时,编译器是不会察觉
的―――因为它是 static 类型的,其作用域不会扩展到文件外部;但在 C 中,编译器则
会检查到“变量重定义”错误―――因为它是 extern 类型的,它的作用域是整个程序空
间。
4. 在 C++中调用一个 C 函数时,这个函数必须被声明为具有“C”链接,这将指示编译器
按照 C 的符号逻辑去进行函数符号查找。出于安全考虑,通常编程规范规定:所有的.h
头文件必须显式地包含在 extern “C”中,如第 1 条所示。另外,发现目前部分.c 实现代
码中也做了这样的处理,这是完全没有必要的,应去掉!
5. 在 C++的函数声明中,如果形参列表为空,表示这个函数不接受任何参数;但在 C++中
被理解为接受任意数量的参数―――在 C 中,当头文件声明了形如 void func()的函数原
型,而实现文件中将其定义成 void func(int i, in j )时,编译器并不认为是函数声明与函
数实现发生冲突。出于兼容性考虑,特规定:C 代码中无参函数必须声明为 void func(void)
C/C++兼容性程序设计必读
况阳 2008-12
1. 标准 C++预定义了__cplusplus 宏,作为 C++编译器的标记,因此可以在以 C 标准书写但
却用 C++编译器进行编译的代码文件中显示指定代码以 C 方式编译和链接。典型的书写
方式如下:
#ifdef __cplusplus
extern “C”
{
#endif
//函数声明
#ifdef __cplusplus
}
#endif
2. 在 C++中,struct 声明方式与 C 的声明方式大不相同:C++中,当定义结构 struct A{ }时,
A 是一个类型符,等同于 C++的 class 名;而 C 中,A 仅被当作一个标签,并不会被当
作一个类型,也就是说:在 C++中,程序可以使用“A a;”来定义一个结构体 A 变量,
但在 C 中,这样做却是非法的,C 中只能使用 stuct A a 方式来声明。
3. 全局 const 变量如果没有加类型限制符(extern, static, auto),则它在 C 中被理解为 extern
类型,在 C++中被理解为 static 类型。示例如下:
//user_stat.c
//全局变量 g_iUserNum 在 C 编译环境中被理解为 extern const int g_maxUserAllow = 64;
//而在 C++编译环境中被理解为 static const int g_maxUserAllow;
const int g_maxUserAllow = 64;
int getMaxUserNum()
{
return g_maxUserAllow;
}
这就致使在 C++中,如果两个文件中都定义了 const 全局变量时,编译器是不会察觉
的―――因为它是 static 类型的,其作用域不会扩展到文件外部;但在 C 中,编译器则
会检查到“变量重定义”错误―――因为它是 extern 类型的,它的作用域是整个程序空
间。
4. 在 C++中调用一个 C 函数时,这个函数必须被声明为具有“C”链接,这将指示编译器
按照 C 的符号逻辑去进行函数符号查找。出于安全考虑,通常编程规范规定:所有的.h
头文件必须显式地包含在 extern “C”中,如第 1 条所示。另外,发现目前部分.c 实现代
码中也做了这样的处理,这是完全没有必要的,应去掉!
5. 在 C++的函数声明中,如果形参列表为空,表示这个函数不接受任何参数;但在 C++中
被理解为接受任意数量的参数―――在 C 中,当头文件声明了形如 void func()的函数原
型,而实现文件中将其定义成 void func(int i, in j )时,编译器并不认为是函数声明与函
数实现发生冲突。出于兼容性考虑,特规定:C 代码中无参函数必须声明为 void func(void)
1
QQ51212921
资源评论
sincewin
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- xyctf:从入门到精通的实用指南.zip
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
- 基于同态加密技术的匿名电子投票系统源码.zip
- Pyqt5项目框架-PyQt项目开发实践
- 基于C通过MQTT的智能农业大棚管理系统(本科毕业设计)
- python+CNN的网络入侵检测算法源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功