define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。
①被定义为“宏”的标识符称为“宏名”。在编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替代,这称为“宏代替”。宏定义是由源程序中的宏定义命令完成的。宏代替是由预处理程序自动完成的。而宏定义的作用范围仅限于当前文件。
②宏定义有几个优点:一、方便程序的修改 使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可。二、提高计算机的运行效率 使用带参数的宏定义可以完成函数调动的功能,又能减少系统开销,提高运行效率。
③对于宏定义还有几点说明:一、宏定义是用宏名来表示一个字符串,在宏展开时又是以该字符串取代宏名,者之死一种简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序不会对它作检查。如果有错误,只能在编译已经被宏展开后的源程序时发现。二、宏定义不是说明或者语句,在行末不必增加分号,如加上分号则连分号也一起置换。三、宏定义其作用域为宏定义命令起到源程序结束。如果终止其作用域可使用#undef命令。
const,它是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。关于const的用法总结以下几点:
①函数体内修饰局部变量
例:void main()
{
const int a=0;
}
const作为一个类型限定词,和int有着相同的地位。const int a;//int const a;是等价的。于是在此处我们应该知道const修饰的对象是谁,是a,和int没关系。const要求他的对象为常量,不可被改变,不可被赋值,不可为左值。
②在函数声明时修饰参数
根据常量指针与指针常量,const修饰函数的参数也是分为三种情况
1、防止修改指针指向的内容
void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。
2、防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )
指针p1和指针p2指向的地址都不能修改。
3、以上两种的结合。
③修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例:
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
④全局变量
使用extern(extern是计算机语言中的一个函数,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。)
例:extern const double pi;
const double pi=3.14;
然后其他需要使用pi这个变量的,包含file1.h #include "file.h"或者复制声明。
const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就是让更多的逻辑错误在编译期被发现。
enum,枚举类型是一种基本数据类型,定义一般为:enum 枚举名{枚举值表};在枚举值表中应罗列出所有可用值。这些值也被称为枚举元素。
①枚举的定义,枚举值是常量,不是变量。不能再程序中用赋值语句在对它赋值。
第一种定义为:
enum box{pencil,pen};
enum box box2;//或者简写成box box2;
再有一种就是在声明的时候同时定义。
enum {pencil,pen}box,box2; //在声明的同时进行定义!
如果直接enum box{pencil=3,pen};};//这里pen就是4系统将自动进行pen=4的定义赋值操作。
又如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作
②枚举元素本身由系统定义了一个表示序号的值,从0开始顺序定义为0,1,2,,,。如在weekday中,sun值为0,mon值为1,…,sat值为6。
例:void main()
{
enum weekday{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
a=sun;
b=mon;
c=tue;
printf("%d,%d,%d",a,b,c);
}
说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
a=sum;
b=mon;
是正确的。而:
a=0;
b=1;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
a=(enum weekday)2;
其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。