编译原理

来源:互联网 发布:淘宝蓝海选品软件 编辑:程序博客网 时间:2024/04/29 09:05

1.<>和“”区别是,如果自己写的.h文件就用“”,如果是系统中的就用<>.

2.宏定义又称为宏替换,不带参数的宏:#define 标识符 字符串。

3.带参数的宏:# define M(y)   (y*y+3*y) 定义M表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏替换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。

4.条件编译#ifndef,#define,头文件,#endif,#else.

5.编译原理分为三个阶段:预编译阶段,编译阶段,链接阶段。

6.预编译阶段是工程中所有宏命令起作用的阶段,比如#include、#define、#undef、#ifdef等等宏命令。在这个阶段完成工程中所有的宏替换。前页工程中预编译处理如下所示,可以看出经过预编译之后源代码中就没有头文件了,只剩下源文件,也没有宏定义了。

7.编译阶段是工程中所有声明起作用的阶段,对于某个标识符的使用只要在之前有该标识符的声明就可以编译通过。所有在工程中的源文件将被编译为目标文件,后缀名为obj,编译中每个参加编译的源文件中不能有重复定义的标识符,声明可以有任意次重复。只要满足上述要求就可以顺利通过编译。

8.链接是定义起作用的阶段,要求整个工程中必须要有被访问的标识符的定义,所有的obj文件、以及库函数所在的lib文件都将参加链接(链接器会自动去链接C运行时库)相互之间会去寻找访问的标识符的定义,链接的时候整个工程中所有的obj文件不能有重复定义的标识符

9.


10.


11.代码如下图:

//#include <iostream>

//using namespace std;

////宏的种类1:-----无参数的宏-----

//#define PI 3.14f //宏不能有分号

////获取圆的面积

//float getArea(float fRadiu)

//{

//return PI*fRadiu*fRadiu;

//}

////获取圆的周长

//float getRound(float fRadiu)

//{

//return 2.0f*PI*fRadiu;

//}

////宏的种类2:-----有参数的宏-----

//#define  M(i)  i*i+3*i

//#define  N(i,j) i+i*j

//void main()

//{

////宏的种类1:-----无参数的宏的调用-----

//float fRadiu = 3.0f;

//cout<<"半径为"<<fRadiu<<"的圆的面积为:"<<getArea(fRadiu)<<endl;

//cout<<"半径为"<<fRadiu<<"的圆的周长为:"<<getRound(fRadiu)<<endl;

////宏的种类2:-----有参数的宏的调用-----

//cout<<M(2)+3<<endl;//结果为13 :2*2+3*2+3

//cout<<M(2)*3<<endl; //结果为22 :i*i+3*i*3 等价于 2*2+3*2*3

////注意:宏替换,完全替换

//cout<<N(3,5)*2<<endl;//3+3*5*2

//system("pause");

//}

//------------条件编译指令/编译预处理指令-----------

#include <iostream>

using namespace std;

/*

#ifdef//如果......

#ifndef//如果没......

#else//否则......

#endif//结束如果......

*/

//#define SAFE_DELETE_

#ifndef SAFE_DELETE_

#define SAFE_DELETE_

inline void Safe_Delete(int* & p ){delete p;p = NULL;}//内联函数

#endif

void main()

{

int * pTemp = new int(100);

cout<<*pTemp<<endl;

*pTemp = 200;

cout<<*pTemp<<endl;

Safe_Delete(pTemp);

system("pause");

}

12.局部域是包含在函数定义或者函数块中的程序文本部分,每一个函数都有一个独立 的局部域,在函数中的每个复合语句或块也有一个独立的局部域。

13.Static和extern作用是相对的。

14.Extern迟绑定技术,在另外的文件可以访问。当加上static时便不能访问。

15.Extern只是对变量进行了声明,声明其作用域为外部的。

extern第二种用法:C语言的形式编译{}中的代码

 extern 'C'

 {

代码

 }

16.代码如下:

//#include <iostream>

////using namespace std;//Using声明,可能会引起命名空间污染

///*

//---------命名空间---------

//定义格式:

//namespace 命名空间名

//{

////命名空间中的内容:常量、变量、函数等......

//}

//*/

//int iValue = 100;

//using std::cout;//Using指示

//using std::endl;

//namespace mySpace

//{

//int iValue = 200;

//int getSum(int a , int b){return a+b;}

//}

//void main()

//{

//cout<<iValue<<endl;

//cout<<mySpace::iValue<<endl;

//system("pause");

//}

////----------作用域-----------

//#include <iostream>

//using namespace std;

//int iValue = 10;

//int max(int a , int b)

//{

//cout<<"外边"<<endl;

//return a>b?a:b;

//}

//namespace mySpace1

//{

//int max(int a , int b)

//{

//cout<<"mySpace2"<<endl;

////这里的::的作用是调用程序匿名的命名空间中的XXXX

//return ::max(a,b);//指示调用当前命名空间外部的max

//}

//}

//void main()

//{

//cout<<mySpace1::max(3,5)<<endl;

//system("pause");

//}

//在当前main.cpp文件中要使用另外一个cpp文件:

//test.cpp中的变量iWeight

#include <iostream>

using namespace std;

//extern关键字的用法一: 声明为外部的

//“迟绑定”技术

extern int iWeight;

//extern关键字的用法二:以C语言的形式编译{}中的代码

// extern 'C'

// {

//代码

// }

void main()

{

cout<<iWeight<<endl;

system("pause");

}

17.代码书写规范

18.g_全局变量,c_常量,m_类的成员变量。



0 0
原创粉丝点击