刚开始学习的时候,会有很多疑惑,例如指针怎么用,结构体跟指针怎么配合,例如函数的参数有什么要求,如何实时更新IO口的数据等。如果重新进行C语言的学习,那么要学很久才能够系统地认识。本文则将比较容易想不起来的知识点进行简单的整理。
1、#ifdef 和 #ifndef
#ifdef 标识符A// 如果标识符A定义了,就编译程序段1,否则编译程序段2
程序段1
#else
程序段2
#endif
#ifndef 的功能则与 #ifdef相反,是没有定义标识符A的时候编译程序段1。
2、全局define
在软件的选项中,有如此一栏,在上面填写的变量则表示在所有的文件中,上述的标识均被定义过。
#ifdef STM32F10X_HD
大容量芯片需要的一些变量定义
#end
3、extern变量申明
C语言中extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里面要注意,对于extern申明变量可以多次,但定义只有一次。
extern u16 USART_RX_STA;
这个语句是申明USART_RX_STA变量在其他文件中已经定义了,在这里要使用到。
下面通过一个例子说明一下使用方法。
在Main.c定义的全局变量id,id的初始化都是在Main.c里面进行的。
Main.c文件
u8 id; //定义只允许一次
main() {
id=1; printf("d%",id); //id=1
test();
printf("d%",id);//id=2
}
但是我们希望在test.c的
changeId(void)函数中使用变量id,这个时候我们就需要在test.c里面去申明变量id是外部定义的了,因为如果不申明,变量id的作用域是到不了test.c文件中。
看下面test.c中的代码:
extern u8 id;//申明变量id是在外部定义的,申明可以在很多个文件中进行
void test(void){ id=2; }
在test.c中申明变量id在外部定义,然后在test.c中就可以使用变量id了。
4、typedef类型别名
typedef用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。typedef在MDK用得最多的就是定义结构体的类型别名和枚举类型了。
struct _GPIO { __IO uint32_t CRL; __IO uint32_t CRH; … };
定义了一个结构体GPIO,这样我们定义变量的方式为:
struct _GPIO G