宏和枚举及typedef
宏和枚举及typedef三者有相似的功能,但又有各自独特的用途和特点,以下主要介绍三者的用法和注意事项。
1. 枚举
a.枚举的目的值提高程序的可读性。
b.枚举类型的声明是指用一组符号名称来代替一组整数常量。
c.枚举常量都是整数类型的。
d.在声明枚举类型时如果没有对符号名称给予指定的值时,第一的符号名称代表的值为0,往后符号名称依次增1。如下代码及结果。
#include <stdio.h>
enum color {RED, GREEN, BLUE};
int main()
{
enum color temp;
printf("%d\n", sizeof(temp)); //枚举变量相当于一个整型变量
printf("RED = %d GREEN = %d BLUE = %d\n",RED, GREEN, BLUE);
return0;
}
e.特别注意如下情况,
#include <stdio.h>
enum color {RED, GREEN, BLUE,\
ORANGE = -5, YELLOW, GRAY,\
VIOLET = 100,BLACK, WITE};
int main()
{
printf("RED = %d, GREEN = %d, BLUE = %d\n"\
"ORANGE =%d, YELLOW = %d, GRAY = %d\n"\
"VIOLET =%d, BLACK = %d,WITE = %d\n", \
RED, GREEN, BLUE, \
ORANGE, YELLOW, GRAY, \
VIOLET, BLACK, WITE);
return0;
}
f.当一组宏是连续的相差为1的值时可以用枚举来代替。
2. typedef
typedef是给数据类型定义新的名字,虽然宏也可实现这个功能但是一般不用宏去实现。以下代码是typedef和宏定义类型新的名字的区别,
#include <stdio.h>
#define pToChar char* //末尾没有分号
typedef char* p_to_char; //末尾有分号
int main()
{
pToChar pca, pcb; //pca是char*类型, pcb是char类型
p_to_char pcc, pcd; //pcc和pcd都是char*类型的变量
printf("sizeof(pca) = %d,sizeof(pcb) = %d\n"\
"sizeof(pcc)= %d,sizeof(pcd) = %d\n",
sizeof(pca), sizeof(pcb), sizeof(pcc), sizeof(pcd));
return0;
}
3. 宏
a.宏是单纯的替换,并且宏可以有参数。
#include <stdio.h>
#define ONEPTWO 1+2
#define Temp1(x, y) x*y
#define Temp2(x, y) (x)*(y)
int main()
{
int sum1 = ONEPTWO * 5; //sum1= 1+2*5
int sum2 = Temp1(5+6,7+8); //sum2= 5+6*7+8
int sum3 = Temp2(5+6,7+8); //sum3= (5+6)*(7+8)
printf("ONEPTWO * 5 = %d\n"\
"Temp1(5+6,7+8) = %d\n"\
"Temp2(5+6,7+8) = %d\n",\
sum1,sum2, sum3);
return0;
}
b.预定义处理的指令有:#define,#include,#ifdef,#else,#endif,#ifndef,#if,#line,#error,#pragma。
c.通常会用#ifndef,#ifdef,#define,#endif来防止头文件的重定义。
#ifndef INCLUDE //INCLUDE一般为头文件的名字
#define INCLUDE
//-----头文件的内容-------//
#endif
d.#undef使用于移除一个宏定义,可以是之前没有定义过的,(#undef一般是用防止宏的重定义)
#include <stdio.h>
#define ONE 1
int main()
{
printf("ONE = %d\n", ONE);
#undef ONE //移除宏
#undef TWO //移除之前没定义过的宏
#ifdef ONE
printf("ONEis define\n");
#else
printf("ONE is undefined\n");
#endif
return0;
}
e. 宏和const常量的区别:const常量是有确定类型的,而宏是单纯的替换没有具体的类型(计算机自动跟据宏的值选择合适的类型)。(计算机编译处理的方式也不同)
#include <stdio.h>
#define ONEVAR 20
const int oneVar = 20;
int iArray1[ONEVAR] ={1,2}; //合法
//int iArray2[oneVar]; //错误
const int towVar = 3 * ONEVAR; //合法
//const int threeVar = 3 * oneVar; //错误
int main()
{
//staticconst int threeVar = 3 * oneVar; //错误
constint threeVar =3 * oneVar;//合法
return0;
}
f.运用符号“#”可在宏中用宏参数创建字符串。
#include <stdio.h>
#define PRINT(name) printf("My name is"#name"!\n")
int main()
{
intntemp = 5;
PRINT(ntemp); //以"ntemp"构建字符串,不去访问ntemp的值
PRINT(czs19910328); //以"czs19910328"构建字符串
return0;
}
g.在宏中可以用“##”把两个语言符号组合成单个语言符号。
#include <stdio.h>
#define nameVar(first, last) first##last
int main()
{
int sum1= 10;
intsum2 = 20;
intsum3 = 30;
intnameVar(sum,4) = 40;
inti = 0;
printf("sum1 = %d\n", nameVar(sum, 1));
printf("sum2 = %d\n", nameVar(sum, 2));
printf("sum3 = %d\n", nameVar(sum, 3));
printf("sum4 = %d\n", sum4);
return0;
}