Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44121
  • 博文数量: 12
  • 博客积分: 315
  • 博客等级: 一等列兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-25 11:10
文章分类
文章存档

2011年(12)

我的朋友

分类: C/C++

2011-03-14 02:44:10

4.1基本概念
1.main的形式
C++标准规定了所有的编译器版本应该至少允许下面两种main函数
int main(){/*...*/}和
int main(int argc, char* argv[]){/*...*/}

2.main的返回值
return的作用是离开main(),销毁任何具有自动存储生命期的对象,将其返回值作为参数调用exit(),
返回操作系统;如果main中没有return语句,则效果相当于在最后执行return 0;

3.命令行参数
main的参数是由系统启动程序截获并打包成字符串后传递给main的形参argv的,所有参数的个数则传
递给argc.

4.内部名称
C语言中除了只在局部编译单元作用的static函数,全局函数是不能同名的,因为C语言起的函数内部
名称,只是在名称前面加前缀"_".
C++中,函数的内部名称经过了重命名,称为Name-Mangling,把函数所属作用域名称(如
class,namespace)和参数信息等作为前缀或者后缀,这样就可以区分了.

5.连接规范
extern "C" struct{...};
extern "C" void func(..){..}//对单个类型指定连接规范
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}{
#endif //对一段代码指定连接规范

6.变量初始化
全局变量(extern和static)存放在程序的全局数据区,在进入main()之前创建,main()结束之后销毁,
因此我们只能在所有函数外面给变量初始化(否则,系统会自动将变量初始化为0值);
而自动变量的初始化,则要完全由程序员来初始化.
在不同编译单元中定义的全局变量初始值不要有依赖关系,因为连接的时候并不能保证编译单元的连
接顺序.
//file1.c
int g_x=100;
//file2.c
extern int g_x;
double g_d=g_x+10; //g_d的值无法预料
7.编译单元和独立编译技术
每一个源代码文件就是一个最小的编译单元,每一个编译单元可以独立编译,所以单独编译时无法发
现同名变量或者函数的问题,当把两个目标文件连接到一起的时候就会出错.
独立编译的好处在于公开接口隐藏实现,需要的时候用连接器把文件和库代码连接成可执行程序即可
,并且可以大大减少代码编译时间.
 
 
4.2基本数据类型和内存映像
1.NULL的值,在C和C++之中,含义有所不同
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
2.bool类型是C++中定义的,但是C语言某些实现通过库提供了映射,例如
typedef int BOOL;
#define TRUE 1
#define FALSE 0
3.Big Endian和Little Endian存储格式
Big Endian:存储时,高字节和高位在前(设定内存地址由低向高)
Little Endian:存储时,低字节和低位在前(设定内存地址由低向高)
4.自然对齐:基本数据类型不能在内存中随意存放,他们的起始地址必须能够被数据类型的大小整除,
例如32位机器中,int型和指针类型变量的起始地址必须能被4整除
 
 
 
4.3隐式转换
1.is-a关系:char is-a int,int is-a long, long is-a float, float is-a double
一个低级数据类型对象总是优先转换为能够容纳的下他的最大值的,占用内存最少的高级类型对象,
例如int在某些情况下可以转换为unsigned类型即可
2.派生类和基类之间也是is-a关系,可以直接将派生类对象转换为基类对象,虽然这样会发生内存截
断,但是转换是安全的,这是因为C++保证:派生类对象必须保证基类子对象的完整性,即派生类中基类
子对象的内存映像和真正的基类对象的内存映像一致.
3.任何非void类型指针都可以转换为void型指针,但是反过来不行,除非进行强制转换.
 
阅读(1815) | 评论(0) | 转发(0) |
0

上一篇:4函数与程序结构

下一篇:第5章C++/C常量

给主人留下些什么吧!~~