宏和枚举及typedef

来源:互联网 发布:马克斯cms怎么安装 编辑:程序博客网 时间:2024/06/15 08:43

宏和枚举及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;    //pcachar*类型, pcbchar类型

        p_to_char pcc, pcd; //pccpcd都是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;

}


0 0
原创粉丝点击