比较C语言中带参数的宏
- 格式:pptx
- 大小:161.54 KB
- 文档页数:6
详解C语⾔的宏定义宏定义介绍假设我们有⼀个 C 源⽂件 main.c,那么只需要通过 gcc main.c -o main.exe 即可编译成可执⾏⽂件(如果只写 gcc main.c,那么 Windows 上会默认⽣成 a.exe、Linux 上会默认⽣成 a.out ),但是这⼀步可以拆解成如下步骤:预处理:gcc -E main.c -o main.i,根据 C 源⽂件得到预处理之后的⽂件,这⼀步只是对 main.c 进⾏了预处理:⽐如宏定义展开、头⽂件展开、条件编译等等,同时将代码中的注释删除,注意:这⾥并不会检查语法;编译:gcc -S main.i -o main.s,将预处理后的⽂件进⾏编译、⽣成汇编⽂件,这⼀步会进⾏语法检测、变量的内存分配等等;汇编:gcc -c main.s -o main.o,根据汇编⽂件⽣成⽬标⽂件,当然我们也可以通过 gcc -c main.c -o main.o 直接通过 C 源⽂件得到⽬标⽂件;链接:gcc main.o -o main.exe,程序是需要依赖各种库的,可以是静态库也可以是动态库,因此需要将⽬标⽂件和其引⽤的库链接在⼀起,最终才能构成可执⾏的⼆进制⽂件。
⽽这⾥我们主要来介绍⼀下预处理中的宏定义,相信很多⼈都觉得宏定义⾮常简单,但其实宏定义有很多⾼级⽤法。
我们先来看看简单的宏定义:#include <stdio.h>// 宏定义的⽅式为:#define 标识符常量// 然后会将所有的 PI 替换成 3.14#define PI 3.14int main() {printf("%f\n", PI);}我们⽣成预处理之后的⽂件:gcc -E main.c -o main.i我们看到 PI 被替换成了 3.14,当然除了浮点型之外,也可以是其它的类型:#include <stdio.h>#define NAME "satori"#define AGE 17#define GENDER 'f'int main() {printf("%s %d %c\n", NAME, AGE, GENDER); // satori 17 f}我们再来查看⽣成的预处理⽂件:我们看到确实只是简单替换,除此之外,没有做任何的处理。
C语言宏定义宏定义是C提供的三种预处理(宏定义、文件包含、条件编译)的其中一种,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。
在C语言中允许用一个标识符来表示一个字符串,称为宏;该字符串可以是常数、表达式、格式串等。
在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。
宏定义是由源程序中的宏定义命令完成的。
C语言中提供的宏定义命令是#define该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义1、简单的宏定义#define <标识符> <字符串>其中的标识符就是所谓的符号常量,也称为“宏名”。
例: #define PI 3.14159262、带参数的宏定义#define <标识符> (<参数表>) <宏体>例: #define A(x) x(1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#define S(r) ((r)*(r))(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。
宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。
(6)函数只有一个返回值,利用宏则可以设法得到多个值(7)宏展开使源程序变长,函数调用不会(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)3、说明(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。
例如:数组大小常用宏定义(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
一.#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。
1 #define命令剖析1.1 #define的概念#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
(1) 简单的宏定义:#define <宏名> <字符串>例: #define PI 3.1415926(2) 带参数的宏定义#define <宏名> (<参数表>) <宏体>例: #define A(x) x一个标识符被宏定义后,该标识符便是一个宏名。
这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
1.2 宏替换发生的时机为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。
当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程,见图1。
源程序预处理器修改后的源程序编译器汇编程序汇编器可重定位的目标程序连接器可执行的目标程序图1 C语言的编译过程其中预处理器产生编译器的输出,它实现以下的功能:(1)文件包含可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。
(2)条件编译预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。
C语言中宏定义中if else语法格式1. 宏定义概述在C语言中,宏定义是一种预处理指令,用于将一个标识符替换为一个指定的字符串或代码段。
宏定义可以简化代码,提高代码的可读性和可维护性。
在宏定义中使用if else语法格式,可以根据条件来选择不同的代码段进行替换,从而实现代码的灵活性和通用性。
2. 宏定义中的if else语法格式在C语言中,宏定义中的if else语法格式为:```#define 宏名源代码``````#ifdef 宏名源代码1#else源代码2#endif```3. 宏名的说明宏名是一个标识符,用于在代码中表示一个特定的宏定义。
在定义宏名时,通常使用大写字母和下划线来命名,以区分于普通变量和函数名。
4. ifdef指令#ifdef是一个预处理指令,用于判断指定的宏名是否已经定义。
如果宏名已经定义,则执行源代码1,否则执行源代码2。
5. else指令#ifdef指令的作用是在宏名已经定义的情况下执行源代码1,而else 指令则是在宏名未定义的情况下执行源代码2。
6. endif指令#ifdef和#else之间的源代码1和源代码2是通过#endif指令来结束的。
该指令用于标记#ifdef的结束位置,以便让编译器知道代码的分界。
7. 实例演示下面通过一个实例演示宏定义中的if else语法格式:```#define DEBUG#ifdef DEBUGprintf("Debugging information\n");#elseprintf("No debugging information\n");#endif```在上面的例子中,首先定义了一个名为DEBUG的宏名,然后使用#ifdef指令来判断DEBUG是否已经定义,如果已定义则输出"Debugging information",否则输出"No debugging information"。
C语言中的宏定义(全面整编) 目录1. 简单宏定义2. 带参数的宏3. 运算符4. 运算符5. 宏的通用属性6. 宏定义中圆括号7. 创建较长的宏1. 较长的宏中的逗号运算符2. 宏定义中的do-while循环do3. 空操作的定义8. 预定义宏9. C语言中常用的宏1. 简单宏定义简单的宏定义有如下格式:[#define指令(简单的宏)] #define 标识符替换列表替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。
当预处理器遇到一个宏定义时,会做一个“标识符”代表“替换列表”的记录。
在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。
不要在宏定义中放置任何额外的符号,否则它们会被作为替换列表的一部分。
一种常见的错误是在宏定义中使用 = :#define N = 100 /*** WRONG ***/int a[N]; /* 会成为 int a[= 100]; */在上面的例子中,我们(错误地)把N定义成一对记号(= 和100)。
在宏定义的末尾使用分号结尾是另一个常见错误:#define N 100; /*** WRONG ***/int a[N]; /* become int a[100;]; */这里N被定义为100和;两个记号。
在一个宏定义中,编译器可以检测到绝大多数由多余符号所导致的错误。
但不幸的是,编译器会将每一处使用这个宏的地方标为错误,而不会直接找到错误的根源——宏定义本身,因为宏定义已经被预处理器删除了。
简单的宏主要用来定义那些被Kernighan和Ritchie称为“明示常量”(manifest constant)的东西。
使用宏,我们可以给数值、字符和字符串命名。
#define STE_LEN 80#define TRUE 1#define FALSE 0#define PI 3.14159#define CR '\r'#define EOS '\0'使用#define来为常量命名有许多显著的优点:1) 程序会更易读。
c语言宏定义格式C语言宏定义格式C语言中的宏定义是一种预处理指令,它可以将一些常用的代码片段定义为一个宏,以便在程序中多次使用。
宏定义的格式如下:#define 宏名替换文本其中,宏名是定义的宏的名称,替换文本是宏定义的内容。
宏名可以是任何合法的标识符,但是不能是C语言的关键字或保留字。
替换文本可以是任何合法的C语言代码,包括表达式、语句、函数等。
宏定义的作用是将一些常用的代码片段定义为一个宏,以便在程序中多次使用。
例如,我们可以定义一个求平方的宏:#define SQUARE(x) ((x)*(x))这个宏定义了一个名为SQUARE的宏,它的替换文本是一个表达式,用来求一个数的平方。
在程序中,我们可以使用这个宏来求任何一个数的平方,例如:int a = 5;int b = SQUARE(a);在这个例子中,宏SQUARE被展开为((a)*(a)),所以b的值为25。
宏定义还可以带参数,例如:#define MAX(x,y) ((x)>(y)?(x):(y))这个宏定义了一个名为MAX的宏,它的替换文本是一个表达式,用来求两个数中的最大值。
在程序中,我们可以使用这个宏来求任何两个数中的最大值,例如:int a = 5;int b = 7;int c = MAX(a,b);在这个例子中,宏MAX被展开为((a)>(b)?(a):(b)),所以c的值为7。
宏定义还可以使用条件编译指令,例如:#ifdef DEBUG#define DEBUG_PRINT(x) printf x#else#define DEBUG_PRINT(x)#endif这个宏定义了一个名为DEBUG_PRINT的宏,它的替换文本是一个printf语句。
在程序中,如果定义了DEBUG宏,则可以使用DEBUG_PRINT来输出调试信息,例如:#define DEBUGDEBUG_PRINT(("a=%d,b=%d\n",a,b));在这个例子中,宏DEBUG_PRINT被展开为printf(("a=%d,b=%d\n",a,b)),所以输出a和b的值。
Linux C 宏C语言中引入宏主要是为了c程序在编写时的方便,运行的高效以及方便维护。
其实宏的本质就是文本的替换,但我们在使用时具体细节总是不清楚,现在时候全面了解它了。
基本的使用规则:1、无参型简单的宏定义,使用中最常见:#define <宏名> <字符串>如上是最常用也是最简单的一种宏使用的形式,在程序中就是一种简单的替换,如:#define MAX 100char ch[MAX];//在程序运行时,MAX实际上被100所替换。
2、带参数宏,linux内核中非常常见:#define <宏名>(<参数表>)<宏体>举例使用如下:#define MAX(A,B) (((A)>(B))?((A):(B)))int a=MAX(100,200); //通过调用宏可以直接计算出两个数的大者,而且AB可以是表达式。
其中以上宏的定义中,大家可以发现有很多括号,这也是为了使宏更加通用,而且保证使用中不容易出错,大家可以想一下,如果我写成这个形式:A>B?A:B如果我在调用时,这样调用:MAX(19+(3+5),30*(3+7));宏替换后就变成:19+(3+5)>30*(3+7)?19*(3+5):30*(3+7);你还能得到你想要的结果吗?显然,这种调用很容易出错,但是如果我们在每一个参数上都包一个括号,则就会大大增加宏的使用范围以及保证使用中不会出问题,所以原则上这种宏的使用,能够加括号的尽量多加括号。
3、宏的特殊使用方法:#define <宏名>(< a,b>)a##b此宏的作用用于连接a,b 在实际编译后#号是不存在的,所以最终的替换是ab,如:#define FUN(a,b) a##bint a2=454;printf(“%d”,FUN(a,2));以上输出结果将是454,也就是在实际运行中FUN(a,2)被替换成了a2 。
宏定义(⽆参宏定义和带参宏定义),C 语⾔宏定义详解1、宏定义说明宏定义是⽐较常⽤的预处理指令,即使⽤“标识符”来表⽰“替换列表”中的内容。
标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。
常见的宏定义有两种,不带参数的宏定义和带参数的宏定义。
2、⽆参宏定义⽆参数宏定义的格式为:#define 标识符替换列表替换列表可以是数值常量、字符常量、字符串常量等,故可以把宏定义理解为使⽤标识符表⽰⼀常量,或称符号常量。
说明:1. 可以不在⾏⾸,但只允许它前⾯有空格符。
例如:#define PI 3.1416 //正确,该⾏#前允许有空格int a;#define N 5 //错误,该⾏#前不允许有空格外的其他字符2. 标识符和替换列表之间不能加赋值号 =,替换列表后不能加分号#define N =5 //虽语法正确,但预处理器会把N替换成=5int a[N]; //错误,因为宏替换之后为 int a[=5];宏定义不是语句,是预处理指令,故结尾不加分号。
如果不⼩⼼添加了分号,虽然有时该宏定义没问题,但在宏替换时,可能导致 C 语法错误,或得不到预期结果。
例如:#define N 5; //虽语法正确,但会把N替换成5;int a[N]; //语法错误,宏替换后,为int a[5;];错误3. 由于宏定义仅是做简单的⽂本替换,故替换列表中如有表达式,必须把该表达式⽤括号括起来,否则可能会出现逻辑上的“错误”。
例如:#define N 3+2int r = N * N;宏替换后为:int r=3+2*3+2; //r=11如果采⽤如下形式的宏定义:#define N (3+2)int r=N*N;则宏替换后,为:int r=(3+2)*(3+2); //r=254. 当替换列表⼀⾏写不下时,可以使⽤反斜线\作为续⾏符延续到下⼀⾏。
例如:#define USA "The United \States of \America"该宏定义中替换列表为字符串常量,如果该串较长,或为了使替换列表的结构更清晰,可使⽤续⾏符 \ 把该串分若⼲⾏来写,除最后⼀⾏外,每⾏⾏尾都必须加续⾏符 \。
函数和宏定义一.目的和要求1、掌握函数的定义方法和调用规则。
2、掌握C语言程序中主调函数和被调用函数之间进行数据传递的规则。
3、了解函数的返回值及它的类型,并正确使用它。
4、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。
5、练习递归函数的使用。
6、理解宏的概念,掌握定义无参宏和带参宏的方法。
了解文件包含的概念,掌握其用法。
7、理解内部函数和外部函数,了解外部函数的编译和连接的方法。
二.相关知识1、函数的概念函数是一个可以反复使用的程序段,从其它的程序段中均可以通过调用语句来执行这段程序,完成既定的工作。
从程序设计的角度来看,函数可以分为两种:①标准函数,即库函数。
②自定义函数。
从函数形式的角度来看,函数也可分为无参函数和有参函数两种。
2、函数的定义一个函数在被调用之前必须先定义,函数定义的一般形式:存储类型数据类型函数名(形式参数表){ 数据定义语句序列;执行语句序列;}3、函数的调用函数调用按函数是否有返回值分为有返回值的函数调用和无返回值的函数调用。
其格式如下:函数名(实参表)[;]无返回值的函数调用格式,最后要有一个语句结束符“分号”。
4、函数的声明函数声明是指在主调函数中,对在本函数中将要被调用的函数提前作的必要的声明。
函数声明的一般格式为:存储类型数据类型函数名(形式参数表);注意:①当函数定义在前,主调函数的定义在后时,可以缺省函数声明。
②如果被调的用户函数和主调函数不在同一编译单位,则在定义函数的编译单位应将该函数定义成extern,在主调函数的函数体中将该函数说明为extern。
5、函数调用中的数据传递方法C语言规定在函数间传递数据有四种方式:值传递方式、地址传递方式、返回值方式、全局变量传递方式。
①值传递方式所传递的是参数值,其特点是“参数值的单向传递”。
②地址传递方式所传递的是地址,其特点是“参数值的双向传递”。
③返回值方式不是在形式参数和实际参数之间传递数据,而是通过函数调用后直接返回一个值到主调函数中。
c语言带参数的宏定义例题一、引言在C语言中,宏定义是一种常用的预处理指令,它允许程序员创建可重用的代码片段。
通过宏定义,我们可以简化代码,提高可读性和维护性。
在本文中,我们将讨论如何使用带参数的宏定义在C语言中创建自定义函数。
二、带参数的宏定义基础在C语言中,宏定义类似于函数定义,但它允许我们在编译时直接替换代码中的宏名称。
带参数的宏允许我们在调用宏时提供具体的数据,这样宏可以在不改变代码结构的情况下执行更复杂的操作。
以下是一个简单的带参数的宏定义的例子:```c#defineSQUARE(x)((x)*(x))```这个宏定义将把任何传入的参数`x`的平方作为结果。
例如:```cinta=5;intresult=SQUARE(a);//result的值现在是25```三、带参数的宏定义的应用带参数的宏定义在很多情况下都非常有用,例如:*简化复杂的表达式:使用带参数的宏可以避免编写冗长的表达式,同时保持代码的可读性和简洁性。
*条件编译:通过传递不同的参数,我们可以根据条件选择性地使用不同的代码片段。
*生成代码:宏可以用于生成特定的代码片段,例如循环或条件语句。
下面是一个使用带参数的宏定义的例子,用于生成一个简单的for循环:```c#defineLOOP_STARTdo{\intx=0;\while(1){\if(x<MAX){\x++;\}else{\break;\}\}\}while(0)```这个宏定义将生成一个无限循环,直到`x`的值达到`MAX`为止。
你可以通过传递不同的参数来生成不同条件的循环。
四、总结通过使用带参数的宏定义,我们可以创建自定义函数,简化代码,提高可读性和维护性。
在许多情况下,使用带参数的宏定义可以更有效地处理复杂的逻辑和生成特定的代码片段。
在C语言编程中,灵活使用宏定义可以提高效率和代码质量。
c语言define函数C语言中的define函数又称为宏定义,是一种预编译指令,用于定义一个字符串常量或一个带参数的代码片段。
定义的宏可以在代码中使用,实际上是将宏定义的内容在预处理阶段替换为实际的值或代码。
#define 宏名称宏值宏值可以是一个常量、一个表达式、一段代码块或是一个函数调用,其中还可以带有参数。
当程序执行到define函数所在的语句时,预处理器将自动替换宏名称为宏值,然后将替换后的代码作为源程序继续编译。
下面是一个简单的宏定义示例:#define PI 3.14159上面的宏定义定义了一个常量PI,它的值为3.14159。
在程序中使用时,可以直接使用宏名称PI代替它的值来进行计算或赋值操作。
宏定义还可以带有参数,这种宏定义称为带参数的宏定义。
带参数的宏定义可以将一段代码片段封装起来,然后给予不同的参数来形成不同的代码。
这种宏定义带参数的语法如下:#define SQUARE(x) ((x) * (x))上面的宏定义定义了一个带一个参数x的宏SQUARE(x),它的宏值是一个计算平方值的表达式。
在程序中使用时,可以使用SQUARE(x)来代替(x) * (x),从而计算一个数字的平方值。
宏定义还可以使用#if n defined语句来探测宏是否已经定义过。
这种语句可以在宏定义之前使用,以保证不会重复定义宏。
下面是一个使用#if n defined语句的宏定义示例:上面的宏定义语句中,#ifndef PI表示如果PI未被定义,则执行宏定义语句,并定义PI为3.14159。
如果PI已经被定义,则不执行宏定义语句。
需要注意的是,宏定义只是在编译前进行替换操作,它并不是一个函数或是一个变量。
因此,宏定义不能被修改或赋值,也不能在程序中直接传递给函数。
另外,宏定义也有一定的局限性,不能包含比较复杂的逻辑运算或函数调用。
若要进行复杂的计算或使用函数调用,则需要编写实际的函数来进行处理。
总的来说,define函数是一种非常方便的宏定义技术,可以用于简化代码的书写和加速程序的执行。
C语言宏定义算式1. 简介在C语言中,我们可以使用宏定义(define)来定义一个常量或者一个带有参数的宏。
宏定义算式是指在宏定义中包含了一些数学运算或者表达式,可以让我们在编写程序时更加方便地使用这些算式。
2. 宏定义的基本语法宏定义使用#define关键字来定义,基本语法如下:#define 宏名替换文本其中,宏名是我们自定义的标识符,替换文本是该宏定义被替换的内容。
在宏定义中,可以使用一些特殊的符号来表示参数,比如##用于连接两个参数,#用于将参数转换为字符串等。
3. 定义简单的算式宏我们可以使用宏定义来定义一些简单的算式,比如计算两个数的和、差、乘积等。
下面是一些示例:#define ADD(a, b) ((a) + (b))#define SUB(a, b) ((a) - (b))#define MUL(a, b) ((a) * (b))这样,我们就可以在程序中使用这些宏来进行计算了。
例如:int result = ADD(3, 5); // result的值为8int result2 = SUB(10, 6); // result2的值为4int result3 = MUL(2, 3); // result3的值为6通过宏定义算式,我们可以在编写程序时更加方便地使用这些算式,避免了重复编写相同的代码。
4. 使用宏定义进行复杂的算式运算在宏定义中,我们还可以使用一些复杂的算式进行运算。
例如,我们可以定义一个宏来计算一个数的平方:#define SQUARE(x) ((x) * (x))这样,我们就可以通过宏来计算一个数的平方了,例如:int result = SQUARE(5); // result的值为25同样地,我们也可以定义一个宏来计算一个数的立方:#define CUBE(x) ((x) * (x) * (x))使用这个宏,我们可以计算一个数的立方,例如:int result = CUBE(3); // result的值为27通过使用宏定义算式,我们可以在编写程序时更加方便地进行复杂的算式运算。
#ifndef,#define,#endif作⽤#ifndef 它是if not define 的简写,是宏定义的⼀种,实际上确切的说,这应该是预处理功能三种(宏定义、⽂件包含、条件编译)中的⼀种----条件编译。
在c语⾔中,对同⼀个变量或者函数进⾏多次声明是不会报错的。
所以如果h⽂件⾥只是进⾏了声明⼯作,即使不使⽤# ifndef宏定义,多个c⽂件包含同⼀个h⽂件也不会报错。
但是在c++语⾔中,#ifdef的作⽤域只是在单个⽂件中。
所以如果h⽂件⾥定义了全局变量,即使采⽤#ifdef宏定义,多个c⽂件包含同⼀个h⽂件还是会出现全局变量重定义的错误。
使⽤#ifndef可以避免下⾯这种错误:如果在h⽂件中定义了全局变量,⼀个c⽂件包含同⼀个h⽂件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错误。
⽰例:#ifndef x //先测试x是否被宏定义过#define x程序段1blabla~ //如果x没有被宏定义过,定义x,并编译程序段 1#endif 程序段2blabla~ //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1 条件指⽰符#ifndef 的最主要⽬的是防⽌头⽂件的重复包含和编译。
了解:条件编译当然也可以⽤条件语句来实现。
但是⽤条件语句将会对整个源程序进⾏编译,⽣成的⽬标程序程序很长,⽽采⽤条件编译,则根据条件只编译其中的程序段1或程序段2,⽣成的⽬标程序较短。
如果条件选择的程序段很长,采⽤条件编译的⽅法是⼗分必要的。
#ifndef 和 #endif 要⼀起使⽤,如果丢失#endif,可能会报错。
总结⼀下:在c语⾔中,对同⼀个或者函数进⾏多次声明是不会报错的。
所以如果h⽂件⾥只是进⾏了声明⼯作,即使不使⽤# ifndef,⼀个c⽂件多次包含同⼀个h⽂件也不会报错。
使⽤#ifndef可以避免下⾯这种错误:如果在h⽂件中定义了,⼀个c⽂件包含同⼀个h⽂件多次,如果不加#ifndef,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错.#ifdef 与ifndef类似,ifdef顾名思义,就是if define,看例⼦#ifdef x程序1blabla~#endif 翻译:如果宏定义了x,则执⾏程序1. 此外,还有其他形式,还是看例⼦好些:#ifndef x#define x程序段1#else程序段2#endif 当x没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。