📄 ex10.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 + -