黑马程序员——C语言——宏定义、条件编译、文件包含等

来源:互联网 发布:周末c语言培训 编辑:程序博客网 时间:2024/06/11 02:20

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、预处理指令
1、所有的预处理指令都是以#开头
2、预处理指令分为三种
1)、宏定义
2)、条件编译
3)、文件包含
3、预处理指令在代码翻译成0和1之前,替换成值
4、预处理为止是随便写的
5、预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾
6、宏名一般用大写或者以k开头,变量名一般用小写

#include<stdio.h> #define COUNT 5 //#define 宏名 值int main (){    char *name="COUNT";//出现在双引号中的COUNT不会换成5     int ages[COUNT]={1,2,67,89,90};    for(int i =0;i<COUNT;i++){      printf("%d\n",ages[i])  ;    }    #undf COUNT//从这行开始,COUNT这个宏失效     int a =COUNT;     return 0;} /*1.带参数的宏定义效率比函数高 *//*int sum(int a,int b){    return a+b}*/#include<stdio.h>#define sum(v1,v2) ((v1)+(v2))#define pingfang(a)  ((a)*(a))//宏定义纯粹的是文本替换 int main (){    //pingfang(5+5)  (35)    //pingfang(5+5)/pingfang(2)       int c =pingfang(10)/pingfang(2);    printf("c is %d\n",c);  /*int c = sum(2,3) * sum (6,4);printf("c is %d\n",c);*//*  int a=10;    int b=20;    int c=sum(a,b);    printf("c is %d\n",c);    //int c = sum (a,b) ;*/          return 0;}

二、条件编译
在很多情况下,我们希望程序的其中一部分代码只有在满族一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译.
基本用法

#if 条件1...Code 1...#elif 条件2...Code2...#else...Code3...#endif1>.如果条件1成立,那么编译器就会把#if与#elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)2>.如果条件1不成立,条件2成立,那么编译器就会把#elif与#else之间的code2代码编译进去3>.如果条件1.2都不成立,那么编译器就会把#else与#endif之间的code3编译进去4>.注意,条件编译结束后,要么最后面加一个#endif,不然偶过很严重5>.#if与#elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时产生的.才有使用的意义#if #defined()和#if !Defined()的用法#if 和 #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏。比如:1 #if defined(MAX)2     ...code...3 #endif如果前面已经定义过MAX这个宏,就将code编译进去。它不会管MAX的值是多少,只要定义过MAX,条件就成立。条件也可以取反:1 #if !defined(MAX)2     ...code...3 #endif如果前面没有定义过MAX这个宏,就将code编译进去。2.#ifdef和#ifndef的使用* #ifdef的使用和#if defined()的用法基本一致1 #ifdef MAX2     ...code...3 #endif如果前面已经定义过MAX这个宏,就将code编译进去。* #ifndef又和#if !defined()的用法基本一致1 #ifndef MAX2     ...code...3 #endif如果前面没有定义过MAX这个宏,就将code编译进去。文件包含指令/*1.<>表示系统自带的文件,""表示自定义的文件2.不允许循环包含,比如a.h包含b.h,b.h又包含a.h*/#define LISI_HInt sum (int a ,int b);#ifndef  WANGWU_H#deffine  WANGWU_HInt minus(int a,int b);#endif#include<stdio.h>Int main (){Int c = sum(10,19);Printf(“c is %d\n”, c);Return 0;}Typedef定义类型的关键字/*1.给已经存在的类型起一个新的名称2.使用场合: 1>.基本数据类型2>.指针3>结构体4>.枚举5>.指向函数的指针 */#include<stdio.h> typedef int MyInt;typedef MyInt  MyInt2;//给指针类型char*起了一个新类型名称stringtypedef char* String;int main (){    String name = "jack";    printf("%s\n",name);    return 0;} void test(){    int a;    MyInt i = 10;    MyInt2 c = 20;    MyInt b1,b2;    printf("")}/*外部函数:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数1>.默认情况下所有函数都是外部函数2>.不允许有同名的外部函数 内部函数:定义的函数只能被本文件访问,其他文件不能访问1>.允许不同文件中有同名的内部函数 static对函数的作用:1>. 定义一个内部函数 2>. 声明内部函数 extern对函数的作用:1>.完整的定义一个外部函数2>.完整的声明一个外部函数(extern可以省略,默认情况下声明和定义的函数都是外部函数) */#include<stdio.h>//声明一个内部函数static void test2(); //完整地定义一个外部函数/*extern void test(){    printf("调用了test函数\n");} *///默认情况下,所有函数都是外部函数,所以可以省略extern extern void test(){    printf("调用了test函数\n");} //定义一个内部函数static void test2(){    printf("调用了test2函数\n");    test2();} //声明一个test函数//完整地声明一个外部函数//extern可以省略 //extern void test(); void test(); void test2();int main (){    test();     test2();    return 0; } /*全局变量共分两种: 外部变量: 定义的变量能被本文件和其他文件访问 1>.默认情况下,所有的全局变量都是外部变量 2>.不同文件中的同名外部变量, 都代表着统一变量 内部变量:定义的变量只能被本件访问,不能被其他文件访问 1>.不同文件中同名内部变量,互不影响 static 对变量的作用: 定义一个内部变量 extern对变量的作用: 声明一个外部变量 static对函数的作用: 声明和定义一个内部函数 extern对函数的作用: 用来定义和声明一个外部函数(可以省略) */#include<stdio.h>void test();//定义一个外部变量 int a;//定义一个内部变量static int b; //声明一个外部变量//extern int a; int main(){    b = 10;    test();    printf("b的值是%d\n",b);/*  a = 10;    test();    printf("a的值是%d\n",a);    */    return 0;} #include<stdio.h>//int a;void test(){    printf("a的值是%d\n",a);}static与局部变量#include<stdio.h> /*static修饰局部变量的使用场合:1.如果某个函数的调用频率特别高2.这个函数内部的某个变量值是固定不变的 */void test(){    static double pi =3.14;    double zc =2 * pi * 10;    int a = 0;    a++;    printf("a的值是%d\n",a);//1    /*    static修饰局部变量:    1>.延长局部变量的声明周期:程序结束的时候,局部变量才会被销毁    2>.并没有改变局部变量的作用域        3>.所有的test函数都共享着一个变量b     */     static int b = 0;    b++;    printf("b的值是%d\n",b);//1 }int main(){    test();    test();    test();    return 0;}/*设计一个函数,用来计算b的n次方 *//*递归的2个条件1.函数自己调用自己2.必须有个明确的返回值 */ #include<stdio.h>int pow2(int b,int n);int main(){    int c = pow2(2,10);    printf("%d\n", c);    return 0;}/*pow2(b, 0) == 1pow2(b, 1) == b ==pow2(b, 0) * bpow2(b, 2) == b*b == pow2(b, 1) * bpow2(b, 3) == b*b*b == pow2(b, 2) * b    1>.n为0,结果肯定是1    2>.n>0,pow2(b, n) == pow2(b, n-1) * b*/int pow2(int b,int n){    if (n <= 0) return 1;    return pow2(b, n-1) * b;}int pow2(int b,int n){    //用来保存计算结果    int result = 1;    /*    result *= b;    result *= b;    result *= b;    result *= b;    result *= b;    ...    n次     */     for (int i = 0; i < n; i++)     {        result *= b;    }}
0 0
原创粉丝点击