20、#ifndef INCLUDEFILE_H_
#define INCLUDEFILE_H_
...
#endif
用这种保护方法为了确保在同一文件中只能包含同一个头文件内容一次。
21、保证一个工程的所有文件都是通过同一个编译器编译的。不同的编译器将为同一个函数产生不同的修饰符。
22、存储管理
自动存储:在一个代码(通常是函数)中定义的,生命周期和作用域在这个代码块中。连续性为自动,作用域为可见,无连接性。 个人理解此内存应该是从栈中分配(register关键字声明局部变量的含义,表明该变量是存储在cpu的寄存器,register 只能修饰局部变量)。
静态存储:static 或者是在函数外定义的全局变量,生命周期和作用域是整个程序。连接性3种(外部链接性,内部链接性,无连接性)作用域全局,。 个人理解此存储应该是从堆中分配
静态变量的三种链接性:
int a; 函数外部声明,作用域是整个程序
static int a;函数的外部声明,作用域为整个他所在的文件。
void f(){
static int a; // 函数内部声明,作用域为函数内部
}
动态存储:通过new关键字得到,生命周期是到delete(如果没有delete将一直存在,导致内存泄漏)。个人理解此存储应该是从堆中分配
23、extern 和 ::
int va;
void f(){
extern int wa; // 表示我用的是wa的全局变量,如果没有这个声明程序照样正常运行。个人理解,是让程序更清晰。::wa也是引用外部变量的一种方式(仅限于c++)
}
extern的重要用法是:
再多文件程序中,可以在一个文件中(且只能在一个文件)定义一个外部变量,使用该变量的其他文件必须使用extern声明它。
//file1
int a = 20;
//file2;
extern int a;
void f(){
int b = a + 10;
}
注: const 定义的静态常量时,extern用法和常规变量的用法有所不同。
外部常量的连接性默认是内部的,不过如果想将这个常量做为外部链接性,必须要所有声明的这个常量其他文件都加上extern。
24、cv操作符:const 和 volatile
volatile: 声明每次操作都是从内容读取,而非是寄存器。
一般的程序中几个语句两次使用了同一个变量,编译器会对其优化,将变量放到寄存器中,因为编译器认为这个变量是不变的。当有时并非如此,我们就要用volatile修饰这个变量来避免编译器的这种优化。
auto:可以在声明中使用关键字auto将变量声明为自动变量。
mutable:可以指出,即使结构(或者类)变量为const,其某些成员也是可以改变的。
struct data
{
int a;
mutable int b;
};
const data v = {1,2};
data.a = 2;// 不允许。
data.b = 3;// 允许。
volatile和mutable不是很常用
25、函数的连接性。默认是外部的。 如果想将它变成是内部的,要加static修饰。
26、c语言和c++语言编译器,对函数名的翻译规则不同。比如c可能将void f(int)翻译成_f;而c++会翻译成_f_i;
extern "C" void f(int);// 用c的翻译规则查找函数
extern void f(int);// 用c++的翻译规则查找函数
extern "C++" void f(int);// 用c++的翻译规则查找函数
27、new 的布局
char buffer[100];
void f(){
int * ip1;
ip1 = new (buffer) int;
}
28、名字空间
namespace Myname{
int a;
double f();
}
namespace Myname{
double f(){ //函数定义
...
}
}
对名字空间的操作, ::
Myname::a = 10;
Myname::f();
用using 来简化 ::
using Myname::a; 以后就可以用a代替 Myname::a 了。
未完待续...