⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex10.cpp

📁 C/C++程序设计教程
💻 CPP
字号:

		//	第10章 预处理过程

	
   // [例10.1] #define引入CALLBACK作为占位符,标识符CALLBACK处理为一个空白。
	# include<iostream.h>
	#define CALLBACK
	CALLBACK  void f(char* s)   {    cout<<s<<endl;	   }
	void main()                   //表示f当作回调函数,
	{  	  void (*pf)(char* )=&f;
		  (*pf)("CALLBACK funct");//输出: CALLBACK funct
	}							//在字符串中的宏名CALLBACK不被替换
	
    //[例10.2]宏名n定义为一个局部变量a,p定义为文本串q[2]
	#include<stdio.h>            //下面的注释先行处理为空白。
	#define PI 3.14159          //宏名PI具有类型属性double
	#define n a                 //宏名n的类型属性是a的类型属性为int
	#define LENGTH  2*PI*n          // LENGTH具有类型属性double
	#define p q[2]                     //宏名p的类型属性由q[2]决定
	void main()
	{	int n=1;                      //int n=1;替换为int a=1;
		printf("LENGTH=%f\t",LENGTH);//%f匹配double型的表达式 	 
		char  p [5]={"123","abcd"};      //宏展开为char q[2][5]={"123","abcd"};
        printf("%s,%s\n",q[0],q[1]); 	
	} 	        //输出:LENGTH=6.283180   123,abcd
//	[例10.3] 宏名具有穿透性
	#include<stdio.h>
	void f(void)
	{	const char *s="xxxx";            //局部指针名s有效于当前程序块
        #define  a  "aaaa"     	
	}   //上面这个宏定义在局部范围,但宏名a不受局部范围的限制
	void main()
	{	printf("%s,",a);                      //宏名a在定义之后的源文件中有效    
	   	//printf("%s\n",s);                      //error: 's' : undeclared identifier
	  	#define  a  "bbbb"  //warning: 'a' : macro redefinition 
	  	const char *s="cccc";
	   	printf("%s;%s\n",a,s); 
	}//输出:aaaa,bbbb;cccc
//[例10.4]宏函数的定义和调用, SWAP(a,b)中的a,b要求匹配左值变量。
	#include<stdio.h>
	#define SWAP(a,b)  \
           { temp=a; a=b;b=temp;}     
	#define ArraySize(a)  sizeof((a))/sizeof(*(a))         //计算数组的元素个数
    int    b[]={6,3,4,5};	                         //定义int型全局数组b[4]
    inline    void swapi()
	{	const int n=ArraySize(b);                  //调用宏函数ArraySize(a)
		int temp; SWAP(b[0],b[n-1])                //调用宏函数SWAP(a,b)
	}
	double x=2,y=1;                              //定义double型全局变量x,y
	inline void swapd()	{  	double temp; SWAP(x,y)}
    char*    c[]={"4","3"};	                       //定义char* 型全局指针数组c[2]
    inline void swapp()	{	char* temp; SWAP(c[0],c[1])   	}
	void main(void)
	{      swapd();   printf("%1.0f,%1.0f;",x,y); 
	       swapp();   printf("%s,%s;",c[0],c[1]); 
	       swapi();   printf("%d,%d;",b[0],b[3]); 	
	}//输出结果:1,2;3,4;5,6;
//[例10.5]带参的宏定义和内联函数
		#include<stdio.h>  
    #define MAX(a,b)    (((a) > (b)) ? (a) : (b))     // MAX(a,b)宏计算极大值MAX
    inline max(int a,int b){return a>b ? a : b;}       //内联函数计算极大值
	void main(void)
	{   int b=2;  		int a=3; 
		int c=MAX(a++,b++);                   //程序在vc 6.0上运行输出结果:
	    printf("a=%d,b=%d,MAX(a,b)=%d\n",a,b,c);// a=5,b=3,MAX(a,b)=4
	    b=4;  	 a=3;  c=MAX(a++,b);
		printf("a=%d,b=%d,MAX(a,b)=%d\n",a,b,c); // a=4,b=4,MAX(a,b)=4
		b=2;  	 a=3;  c=max(a++,b++);
	    printf("a=%d,b=%d,max(a,b)=%d\n",a,b,c);	 //a=4,b=3, max(a,b)=3
		b=2;  	 a=3;  c=max(a++,a++);
	    printf("a=%d,b=%d,max(a,b)=%d\n",a,b,c);	 //a=5,b=2, max(a,b)=3
	}
//[例10.6]条件编译指令确定版本的交付
	#include<stdio.h> 
	 // #define BRIEF 
	#define STUDY    
	#define PROFESSION 
	//#define SPLENDOR
	void main(void)
	{
		#if defined(BRIEF)&&!defined(STUDY)
			 printf (" brief info\n");
		#elif	defined(STUDY)&&!defined(PROFESSION)
			printf (" for studying\n");          
		#elif defined(PROFESSION)&&!defined(SPLENDOR)
			printf ("professional\n");        
		#else	printf ("splendid\n");     
		#endif       		
	}         //输出professional
//[例10.7]字符串双引号展开
    #include<iostream.h>        
    #define sout(s)  cout<<#s<<endl
    #define dout(s,v)  cout<<#s<<v<<endl
	void main(void)
	{	                                    //输出结果如下:  
        sout(this string is in double quote);        // this string is in double quote
		sout(  that string is in double quote      ); // that string is in double quote
       	sout("the string" include an escaped \\ quote);//"the string" include an escaped \ quote
        dout(cout<<#s<<endl;,"cout<<#s<<endl");   // cout<<#s<<endl;cout<<#s<<endl
		dout(a=,10000);                        // a=10000 
	}
	//[例10.8] 字符合并操作符##进行动态类型跟踪
	#include<iostream.h>        
	#define sout(s)    cout<<#s<<endl
	#define dout(s,v)  cout<<#s<<v<<endl
	#define  object(type)   class##type
	void main(void)
	{	typedef short    t1;   t1  object(t1)=1;
		typedef long    t2;   t2  object(t2)=2;
		typedef double  t3;   t2  object(t3)=3;						
		sout(please enter num ); int n;
		do{	cin>>n;
			switch(n){
			case 1 : dout(--t1--,object(t1));break;
			case 2 : dout(--t2--,object(t2));break;       //程序运行输出结果如下:
			case 3 : dout(--t3--,object(t3));break;       // please enter num
			default: sout(please enter num 1-3);break;   //4(
			}                                    // please enter num 1-3
		}while(n!=1&&n!=2&&n!=3);                //2(
	}                                           //--t2--2




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -