1.预处理指令:定义:1>预处理指令是指将代码翻译成0和1之前执行的指令。2>全部是#开头,预处理指令位置可以随便写。分类: 宏定义、条件编译、文件包含作用域:从编写指令开始,一直到文件结尾。
2.宏定义(替换代码)关键词:#define 宏名 值 (宏定义只负责换代码,并不负责运算,值中每个参数要加( ))例如:#define count 6 //会将程序中所有count 转化成4 如果代码中是“count” 则此count不会被替换#undef 宏名 :从这行开始,取消define宏的作用。注:宏名一般使用大写(或者以K开头),变量名一般用小写。eg:#DEFINEeg:输出为:c is 35。#define pingfang(a) (a*a)//只是换代码,纯文本替换; #include "stdio.h" int main() { int c = pingfang(5+5);//纯文本替换即:每个a都替换成5+5,结果为5+5*5+5=35 printf("c is %d\n", c); return 0; }
3.条件编译只有满足条件的语句才参与编译,不满足的条件语句不参与编译;只要写了#if,后面一定要加上#endif。#if()A //如果只编译了A,则下面的B和C不会保存在内存中#elif()B#else()C#endif //表示条件编译到此结束注:1>条件编译只编译宏中定义的语句,且如果elif或else没有判断,则此没有保存在内存中(不参与编译的不会保存在内存中)。2>endif必须添加#if defined() 相当于 #ifdef#if undefined 相当于#ifndefeg:#include "stdio.h" #define A 10 int main() { #if(A==10) printf("%d",A); #elif(A==5) printf("%d", A); #else printf("%d",A); #endif return 0; }
4.文件包含注意:1> #include后面<>表示系统自带的文件,""表示自定义文件;2> 不允许循环包含,比如a.h包含b.h,b.h又包含a.h。防止多次包含方法:#ifndef ...#define ........#endif
eg: #idndef _TEST // 如果没有定义_TEST,则会运行以下,就是声明test( )函数,如果定义了,就不会进行声明,防止了文件重复包含#define _TESTtest();#endif
5.类型定义 typedef (取别名)作用:给已经存在的类型起一个新的名称。eg:
#include<stdio.h> typedef int myint;<span style="color: rgb(38, 38, 38); font-family: 微软雅黑; font-size: 14px; line-height: 21px;">//将int类型的别名定义为myint,此时myint就代表int类型。</span>这条语句也可以放在main函数里. int main() { myint i = 10; printf("%d",i);//输出10 return 0; }
使用场合:1>基本数据类型typedef int myint;2>指针typedef char * p;//给指针类型char *取了一个新的类型名p3>结构体typedef struct student myStu; //类型名是myStu;<span style="font-family: 微软雅黑;">typedef struct student</span><pre name="code" class="objc"> { int age; };
或者typedef struct student { int age; }myStu;//做了两件事情,1、定义了结构体student;2、将struct student改名为myStu。
(1)定义结构体的指针:typedef struct student * p;//p是名字4>枚举type enum Sex { man, woman, }MySex;
5>指向函数的指针typedef int (*name)(int , int) //name是定以后的名字
6.关键字static和extern1> 对函数的影响外部函数:定义的函数能被本文件和其他文件访问。 (函数默认为外部函数)(其它文件可访问)注:外部函数不能有重名内部函数:定义的函数只能被本文件访问,其他文件不能访问。(只有本文件访问)注:内部函数可以不同文件中函数重名extern: 完整的声明和定义一个外部函数。 extern可以省略,默认情况下声明和定义的都是外部函数。static:完整的声明和定义一个内部函数,static不能省略。eg:extern//one.c #include<stdio.h> //完整的定义一个外部函数 extern void test() { printf("哈哈"); } //main.c #include<stdio.h> extern void test();//完整的申明一个外部函数 int main() { test(); //因为test为外部函数,所以可以在main文件中直接调用,输出”哈哈“ return 0; }
2> 对变量的影响全局变量分类:外部变量:定义的变量能被本文件和其他文件访问。默认情况下所有全局变量都是外部变量且初值为0, (其它文件可访问)注:不同文件中的同名外部变量,都代表着同一个变量。内部变量:定义的变量只能被本文件访问 (只有本文件访问)
外部变量:1> 默认情况下所有的变量都是外部变量;2> 不同文件中的同名外部变量都代表着同一个变量;3> 定义外部变量前不要加extern,直接 int a;就可以了;4> e xtern对变量只有一个作用:申明一个外部变量。5> 外部变量可以放在函数外,也可以放在函数内,放在函数内时,extern不能丢,否则就变成重新定义一个新变量了。内部变量:static的作用只有一个:定义一个内部变量, 只能在本文件中访问。static对局部变量影响(1)延长局部变量生命周期,局部变量就不会随着函数调用结束就被销毁,而是等到程序结束后才被销毁。 (内存空间中一直有此变量)(2)没有改变局部变量的作用域。eg:int test() { int a; //函数调用完之后,a就会被销毁,下次再调用的时候,会重新定义赋值 a++; printf("%d",a); static int b = 0; //第一次调用的时候会分配存储空间,但是函数调用完之后,b并不会被销毁,再次调用时会在原来的基础之上,再次执行,直到程序结束的时候,变量才被销毁。 b++; printf("%d",b); } int main() { test(); test(); return 0; } //此时a0,b=1
<span style="background-color: inherit; font-family: 微软雅黑;"> static修饰局部变量的使用场合:</span>
(1)如果某个变量的调用频率特别高。(2)某个函数内部的某个变量值是固定不变的。
C基础——预处理
最新推荐文章于 2024-08-05 20:42:09 发布