1、位操作2、宏定义3.ifdef条件编译4.extern变量申明5.结构体

合集下载

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。

⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。

3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。

只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。

如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。

c 函数内部宏定义

c 函数内部宏定义

c 函数内部宏定义C函数内部宏定义一、参数检查宏定义在函数内部,我们经常需要对参数进行检查,以确保参数的合法性。

为了简化参数检查的代码,我们可以使用宏定义来实现。

下面是一个示例:```#define CHECK_PARAM(param) \if (!(param)) { \printf("参数错误:%s\n", #param); \return; \}```在上面的示例中,我们定义了一个宏CHECK_PARAM,该宏接受一个参数param,并在参数为假时输出错误信息并返回。

通过使用这个宏,我们可以简化参数检查的代码,提高代码的可读性和可维护性。

二、条件编译宏定义在函数内部,有时我们需要根据不同的条件编译不同的代码。

为了简化条件编译的代码,我们可以使用宏定义来实现。

下面是一个示例:```#define DEBUG_MODE#ifdef DEBUG_MODE#define DEBUG_LOG(...) printf(__VA_ARGS__)#else#define DEBUG_LOG(...)#endif```在上面的示例中,我们定义了一个宏DEBUG_MODE,该宏用于开启或关闭调试模式。

当DEBUG_MODE被定义时,宏DEBUG_LOG会输出调试信息;当DEBUG_MODE未被定义时,宏DEBUG_LOG为空宏。

通过使用这个宏,我们可以方便地在调试模式和发布模式之间切换,提高代码的可维护性。

三、局部变量宏定义在函数内部,有时我们需要定义一些局部变量来辅助实现某些功能。

为了简化局部变量的定义,我们可以使用宏定义来实现。

下面是一个示例:```#define LOCAL_VAR(type, name, value) \type name = value;```在上面的示例中,我们定义了一个宏LOCAL_VAR,该宏接受三个参数:变量的类型type、变量的名称name和变量的初始值value。

c语言define的用法举例

c语言define的用法举例

c语言define的用法举例一、c语言中define的基本用法C语言中的宏定义(define)是一种预处理指令,用于在程序编译之前将某个标识符替换为指定的文本。

它可以提高代码的可读性和灵活性,并简化代码编写过程。

在本文中,我们将介绍define的基本用法,并通过多个示例来说明其具体应用。

1. 定义常量#define可以用于定义常量,即将一个标识符替换为一个固定值。

下面是一个示例:```#define PI 3.14159```在这个示例中,我们将标识符PI定义为3.14159,之后在程序中使用PI时都会被替换为3.14159。

这样做的好处是,在整个程序中使用同样的固定值时只需更改一次即可。

2. 定义简单函数#define还可以定义简单函数,在预处理阶段将函数名替换为相应的代码块。

例如:```#define SQUARE(x) ((x)*(x))```在这个示例中,我们定义了一个计算平方的宏函数SQUARE(x),其中参数x 被使用两次。

当我们在程序中调用SQUARE(x)时,预处理器会将其转换为((x)*(x))并插入到对应位置。

3. 定义带有参数和逻辑操作符的宏函数除了简单函数外,#define还可以定义带有参数和逻辑操作符的宏函数。

下面是一个示例:```#define MAX(x, y) ((x) > (y) ? (x) : (y))```在这个示例中,我们定义了一个找到两个数较大值的宏函数MAX(x, y),其中使用了三目运算符(?:)进行条件判断。

当我们在程序中调用MAX(x, y)时,预处理器会将其转换为((x) > (y) ? (x) : (y))并插入到对应位置。

二、c语言中define的高级应用除了基本使用方式之外,C语言中的define还有一些高级应用,可以提供更强大的功能。

1. 使用#if和#ifdef进行条件编译在编写复杂程序时,常常需要根据不同的条件来编译特定的代码块。

c语言 宏命名规则

c语言 宏命名规则

c语言宏命名规则摘要:1.宏命名规则的概述2.宏命名规则的组成3.宏命名规则的注意事项正文:C 语言是一种广泛使用的编程语言,它具有丰富的语法结构和功能。

在C 语言编程中,宏定义是一种重要的技术,可以帮助程序员简化代码和提高代码的可读性。

本文将介绍C 语言宏命名规则的相关知识。

一、宏命名规则的概述在C 语言中,宏定义是一种用于表示某个符号或表达式的方法。

通过宏定义,程序员可以使用一个简短的名称来表示一段复杂的代码,从而简化代码结构。

宏命名规则是指在定义宏时,需要遵循的命名规范。

二、宏命名规则的组成1.宏名宏名是宏定义中的名称,用于表示宏所代表的含义。

在C 语言中,宏名通常使用大写字母组成,这样可以与其他变量和函数区分开来。

例如,我们可以定义一个宏名MAX,表示两个数中的最大值。

2.宏体宏体是宏定义中的实际内容,它包含了宏所代表的代码或表达式。

在定义宏时,需要保证宏体的正确性和合法性。

例如,我们可以定义一个宏体,用于计算两个数中的最大值:```#define MAX(a, b) ((a) > (b)? (a) : (b))```三、宏命名规则的注意事项1.避免与关键字冲突在定义宏名时,应避免与C 语言的关键字冲突。

关键字是C 语言中具有特定意义的单词,不能作为变量名或宏名使用。

例如,我们不能定义一个名为if 的宏,因为它与C 语言中的if 关键字冲突。

2.避免使用非法字符在定义宏名时,应避免使用非法字符。

非法字符是指C 语言中不允许出现在标识符(如变量名、函数名、宏名等)中的字符。

例如,我们不能定义一个包含空格的宏名,因为空格是非法字符。

3.宏名应具有描述性在定义宏名时,应尽量使其具有描述性,以便于其他程序员理解宏的含义。

例如,我们可以定义一个名为MAX_TEMP 的宏,表示某个温度的最大值。

总之,了解和掌握C 语言宏命名规则对于编程工作非常重要。

C语言中extern关键字详解

C语言中extern关键字详解

extern int div(int x,int y); #endif 文件b.c的内容: #include <stdio.h> int add(int x,int y) { return(x+y); } int sub(int x,int y) { return(x-y); } int mult(int x,int y) { return(x*y); } int div(int x,int y) { if(y!=0) { return(x/y); } printf("mult() fail!the second para can not be zero!\n "); return(-1); } 利用gcc工具编译gcc a.c b.c –o demo,再运行./demo,结果为 x = 10,y = 5 x + y = 15 x-y=5 x * y = 50 x / y = 2。 小结:由上面简单的例子可以看出,在b.h文件中声明好b.c的函数,使 用时,只需要在a.c中包含#include “b.h”头文件即可,这样就可以使用b.c 的接口函数了,在实际工程中,通常也是采用这种方式,.c文件中实现 函数,.h文件中声明函数借口,需要调用.c文件的函数接口时,只需包 含.h头文件即可。
小结:这种用方法简单,实用性不大。 (2) 在多个文件中声明外部变量 作用域:如果整个工程由多个文件组成,在一个文件中想引用 另外一个文件中已经定义的外部变量时,则只需在引用变量的文件 中用extern关键字加以声明即可。可见,其作用域从一个文件扩展 到多个文件了。 例子: 文件a.c的内容: #include <stdio.h> int BASE=2; //变量定义 int exe(int x); //外部函数提前声明 int main(int argc, char *agrv[]) { int a=10; printf("%d^%d = %d\n",BASE,a,exe(a)); return 0; } 文件b.c的内容: #include <stdio.h> extern BASE; //外部变量声明 int exe(int x) { int i; int ret=1; for(i=0;i<x;i++) { ret*=BASE; } return ret; } 利用gcc工具编译gcc a.c b.c –o demo,再运行./demo,结果为 2^10 = 1024。其中,在a.c文件中定义BASE=2,在b.c中引用BASE 时,需要用extern关键字声明其为外部变量,否则编译会找不到该 变量。 小结:对于多个文件的工程,可以采用这种方法来操作。实际 工程中,对于模块化的程序文件,在其文件中可以预先留好外部变

c 语言define详解

c 语言define详解

c 语言define详解在C语言中,`define`是一个预处理指令,用于定义常量或宏。

它告诉编译器在编译之前替换特定的代码或文本。

以下是`define`的一些常见用法:1. 定义常量:使用`define`可以定义常量。

例如:```cdefine PI```在代码中,每当你使用`PI`,它都会被替换为``。

2. 定义宏:`define`也可以定义简单的宏。

例如:```cdefine MAX(a, b) ((a) > (b) ? (a) : (b))```当你在代码中使用`MAX(x, y)`时,它会被替换为`((x) > (y) ? (x) : (y))`。

3. 条件编译:使用`if`、`ifdef`、`ifndef`等预处理指令,你可以根据是否定义了某个宏来决定是否编译某段代码。

例如:```cifdef DEBUG// 当DEBUG被定义时,编译以下代码printf("Debugging information\n");endif```4. 文本替换:除了简单的常量替换,你还可以使用复杂的文本替换。

例如:```cdefine FOO(x) printf("The value of x is: %d\n", x)```这样,每次使用`FOO(y)`时,它都会被替换为`printf("The value of xis: %d\n", y)`。

5. 注意点:预处理指令(如`define`)是在编译之前执行的,所以它们不会进行类型检查或作用域限制。

这意味着如果你在定义宏时犯了一个错误,那么这个错误可能会在整个代码中传播。

使用宏时要小心,因为它们可能会引发一些意想不到的副作用,特别是当宏参数中包含运算符或逗号时。

为了避免这些问题,可以使用括号来确保正确的优先级和运算顺序。

例如:在上面的`MAX`宏中,我们使用了括号来确保正确的运算顺序。

c语言宏定义用法规则

c语言宏定义用法规则

c语言宏定义用法规则C语言宏定义是一种C语言中最常使用的技术,它可以将经常使用的长句子等缩短,可以将复杂的语句也变得更加简单。

使用宏定义,可以提高程序的可读性,使程序更加便于维护和修改,并且可以更加高效地使用程序。

一、宏定义的语法形式C语言的宏定义的语法有以下几种格式:1. #define:#define宏定义用于定义字符串宏或符号宏,本质上它就是把特定的字符串或符号,映射到一个相应的宏名称。

例如:#define PI 3.14159293表示宏定义一个PI,其值为3.141592932. #undef:#undef用于取消宏定义,例如:#undef PI表示取消之前定义流程中的PI宏定义;3. #ifdef:#ifdef可以根据宏定义的存在与否,在程序编译时有选择性的执行一段代码,例如:#ifdef PIprintf("PI is define\n");#endif上述代码表示:如果PI的宏定义存在的话,则编译执行printf("PI is define\n"),否则不执行。

C语言宏定义可以使用参数,这些参数可以是函数、符号、字符串或者表达式,它们都可以在宏定义中扮演角色,使用参数可以提高宏的可扩展性,从而提高程序的复用性,简化程序的结构。

1. 宏定义参数的表示参数的格式使用形式参数名称来表示,一般使用字母a~z表示参数,形式参数可以使用多次,但参数名必须是唯一的。

例如:#define MIN(x, y) ((x) < (y))? (x): (y)这是一个使用参数的宏定义示例,其中参数x,y是表示形式参数的名称,宏定义的意思是返回x和y的较小值。

使用宏定义参数需要在宏定义时明确参数的含义,每个参数都必须有明确的含义,有利于后续的维护和修改。

例如:三、C语言宏定义书写规范1. #define是注释符号,使用时要在一行的开头,以#开头,表示此行的内容是宏定义,且宏定义的关键词必须全大写。

c语言extern的用法

c语言extern的用法

c语言extern的用法在C语言中,extern关键字用于声明一个全局变量或函数,该变量或函数可以在其他文件中定义和使用。

extern关键字有以下几种常见用法:1. 声明全局变量:在一个文件中使用extern关键字声明一个全局变量,然后在其他文件中定义该变量。

这样可以实现多个文件共享同一个全局变量。

Example:file1.c中:extern int globalVariable; // 声明全局变量file2.c中:int globalVariable = 10; // 定义全局变量2. 声明全局函数:在一个文件中使用extern关键字声明一个全局函数,然后在其他文件中定义该函数。

这样可以实现多个文件共享同一个全局函数。

Example:file1.c中:extern void function(); // 声明全局函数file2.c中:void function() // 定义全局函数{// 函数实现}3. 声明外部变量:在一个文件中使用extern关键字声明一个变量,该变量可以是其他文件中定义的全局变量。

这样可以在当前文件中使用其他文件中定义的全局变量。

Example:file1.c中:extern int globalVariable; // 声明外部变量file2.c中:int globalVariable = 10; // 定义全局变量file3.c中:extern int globalVariable; // 声明外部变量void function(){int localVar = globalVariable; // 使用外部变量// 其他操作}4. 声明外部函数:在一个文件中使用extern关键字声明一个函数,该函数可以是其他文件中定义的全局函数。

这样可以在当前文件中调用其他文件中定义的全局函数。

Example:file1.c中:extern void function(); // 声明外部函数file2.c中:void function() // 定义全局函数{// 函数实现}file3.c中:extern void function(); // 声明外部函数void otherFunction(){function(); // 调用外部函数// 其他操作}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.指针
指针是一个特殊的变量,它里面存储的数值 被解释成为内存里的一个地址。
6.指针
6.指针
&操作符:取变量的地址 *操作符:对指针做解引用操作 int a=10; int *p=&a; //让指针p指向存储变量a的单元,
&a就表示是a单元的内存地址, //这个时候的*仅仅表示p是一个指针变量 printf("*p=%d a=%d",*p,a); //将打印出 *p=10,a=10,*p表示是对变量a做操作 *p=5; printf("*p=%d a=%d",*p,a); //将打印出*p=5,a=5
C语言基础知识
1、位操作 2、宏定义 3.ifdef条件编译 4.extern变量申明 5.结构体 6.指针 7.判断语句(if for switch case while 等)
1、位操作
2、宏定义
#define 标识符 字符串 #define SYSCLK_FREQ_72MHz 72000000
举例: Struct U_TYPE { Int BaudRate Int WordLength; }usart1,usart2;
定义: Struct 结构体名字 结构体变量列表 ;
5.结构体
结构体成员变量的引用方法是: 结构体变量名字.成员名
举例:usart1.BaudRate;
结构体指针变量定义也是一样的,跟其他变量 没有啥区别。 举例:struct U_TYPE *usart3; 结构体指针成员变量引用方法是通过“ ->” 符号实现,比如要访问 usart3 结构体指针指 向的结构体的成员变量 BaudRate,方法是: Usart3->BaudRate;
GPIOx->BSRR = GPIO_Pin; }
7.判断语句
if(表达式1)//表达式1条件为真 语句1 else if(表达式2)语句2 else 语句 n
7.判断语句
for(表达式1; 表达式2; 表达式 3) 语句 它的执行过程如下:先求解表达 式1。 求解表达式2,若其值为真(非 0),则执行for语句中指定的内 嵌语句,然后执行下面第3)步; 若其值为假(0),则结束循环, 转到第5)步。 求解表达式3。 转回上面第2)步继续执行。 循环结束,执行for语句下面的 一个语句。
7.判断语句
while语句的一般形式为: while(表达式) 语句
其中表达式是循环条件,语句为循环体
7.判断语句
switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; … case 常量表达式n: 语句n; default: 语句n+1;
}
结合break使用
6.指针
指针作为函数参数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
/* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin));
Main.c 文件
//申明变量 id 是在外部定
u8 id;//只允许一次
义的,申明可以在很多个文
main()
件中进行
{
void test(void){
id=1;
id=2;
printf("d%",id);//id=1 }
test();
printf("d%",id);//id=2
}
5.结构体
声明结构体类型: Struct 结构体名{ 成员列表; };
3.ifdef条件编译
#ifdef 标识符Βιβλιοθήκη 程序段 1#else
程序段 2
#endif
举例:
#ifdef STM32F10X_HD
大容量芯片需要的一些
变量定义
#end
4.extern变量申明
extern u16 USART_RX_STA;
u16 USART_RX_STA;
test.c 文件
extern u8 id;
相关文档
最新文档