程序分成三部分:
头文件:包含结构声明和使用这些结构的函数的原型,使用#define或const定义的符号常量,类声明,模板声明,内联函数
只需将源代码文件加入项目中,而不用加入头文件;不要使用#include来包含源代码文件,这样将导致多重声明。
同一个文件中只能将同一个头文件包含一次,可以使用以下的防护方案。基于预处理器编译命令#ifndef,可以在没有使用#define定义某个特定名称时,处理#ifndef和#endif之间的语句。但这种方法并不能防止编译器将文件包含两次,而只是让他忽略除第一次外的所有内容。
源代码文件:包含与结构相关的函数的代码
源代码文件:包含调用与结构相关的函数的代码
C++标准允许每个编译器以他认为合适的方式实现名称修饰,因此不同编译器创建的对象代码文件很可能无法正确的连接。请确保所有对象文件都是由同一个编译器生成的。
C++的存储连续性:自动存储连续性、静态存储连续性、线程存储连续性、动态存储连续性
在C++11中,关键字auto用于自动类型判断,但在C语言和以前的C++版本中,auto的含义截然不同,它被用于显式指出变量为自动存储。在C++11中,这种用法不再合法。
在C++11前,关键字register用于建议编译器使用CPU寄存器来存储自动变量。在C++11中,关键字register这种提示作用失去,只用于显式指出变量是自动的。
5种变量的储存方式
存储描述 持续性 作用域 链接性 如何声明 自动 自动 代码块 无 在代码块中 寄存器 自动 代码块 无 在代码块中,使用关键字register 静态,无链接性 静态 代码块 无 在代码块中,使用关键字static 静态,内部链接性 静态 文件 内部 不在任何函数内,使用关键字sattic 静态,外部链接性 静态 文件 外部 不在任何函数内 如果在多个文件中使用外部变量,只需在一个文件中包含该变量的定义,但在使用该变量的其它所有文件中,都必须使用关键字extern声明它。
在默认情况下全局变量的链接性为外部的,但const全部变量的链接性为内部的。如果希望某个常量的链接性为外部的,则可以使用extern关键字来覆盖默认的内部链接性。
可以使用static关键字将函数的链接性设置为内部的,即只能在一个文件内使用,但必须同时在原型和函数定义中使用该关键字。
内联函数不受单定义规则的约束,但要求同一个函数的所有内联定义都必须相同。
如果要在C++程序中使用C库中编译的函数可以用函数原型来指定要使用的约定:
extern 'C' 函数定义:使用C语言链接性
extern 函数定义:使用默认方式——C++
extern 'C++' 函数定义:使用C++语言链接性
在程序结束时,由new分配的内存通常都会被释放,但在一些不健壮的操作系统中,可能不会被释放,最佳的做法是使用delete来释放new分配的内存。
如果要为内置的标量的类型、有合适构造函数的类分配空间并初始化,可在类型后面加上初始值,并用括号括起。在C++11中,要初始化常规结构或数组,需要使用大括号的列表初始化。
定位new运算符讷讷够让程序员指定要使用的位置,程序员可能使用这种特性来设置七内存管理规程、处理需要通过特定地址进行访问的硬件或在特定位置创建对象。
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。
using声明使一个名称可用,而using编译命令使所有的名称可用。
如果使用using编译指令将该名称空间的名称导入该声明区域,则局部的版本将隐藏名称空间版本。
using编译指令是可传递的,如果A op B 且 B op C,则A op C,则说操作op是可传递的。
可以给名称空间创建别名:namespace xxx=另一个名称空间。
省略了名称空间的名称来创建未命名的名称空间,则提供了链接性为内部的静态变量的替代品。
名称空间的指导原则:
使用已命名的名称空间声明的变量,而不是使用外部全局变量或静态全局变量。
如果开发了一个函数库或类库,将其放在一个名称空间中。
仅将编译指令using作为一种将就代码转换为使用名称空间的权宜之计。
不要在头文件中使用using编译指令,如果非要使用,应将其放在所有预处理编译指令#include后
导入名称时,首先选用作用域解析符或using声明的方法。
对于using声明,首选将其作用域设置为局部,而不是全局。
来源:oschina
链接:https://my.oschina.net/u/1398794/blog/603244