嵌入式C中的一些语言基础知识
1、申明和定义
1.1 变量的定义和声明
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
变量的声明用于向程序表明变量的类型和名字,定义包括声明:当定义变量时我们声明了它的类型和名字。申明可以多次。
可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型前的关键字extern。
extern int i; // declares but does not define i 申明但不定义
int i; // delares and defines i 申明而且定义
PS:如果声明有初始化式,那么它可以当作定义,extern int i=1;而且这种方式,extern必须在函数外面。
1.2 函数的定义和声明
以上都是针对变量,对于函数来说,函数的定义包含实现,比如:
double f(int i, double d)
{return i+d;}
函数的声明:double f(int, double); // 对于函数声明,extern关键字是可以省略的。
无论如何,定义 操作是只能做一次的。如果你忘了定义一些你已经声明过的变量,或者在某些地方被引用到的变量,那么,连接器linker是不知道这些引用该连接到那块内存上的。然后就会报missing symbols 这样的错误。如果你定义变量超过一次,连接器是不知道把引用和哪块内存连接,然后就会报 duplicated symbols这样的错误了。以上的symbols其实就是指定义后的变量名,也就是其标识的内存块。
1.3 头文件防止多次定义
头文件很容易被嵌套include;有时候,有文件中包含对变量的定义,这样就存在变量被多次定义的情况,所以会用以下的格式来避免这种情况的发生:
#ifndef __DELAY_H
#define __DELAY_H
头文件的主体,包含各种函数的申明和变量的声明或者定义,虽然在头文件中对变量进行定义是不推荐的。
#endif