总结一些嵌入式软件开发中C语言面试问题
1、预处理指令#define
有几点需要注意:首先是语法(无分号结束,字母大写,括号使用…);其次明白预处理器会将表达式计算出来代入需要用的地方,所以尽量用表达式来清晰定义其作用而不是直接给出一常量值;还有就是要注意常量值可能的溢出问题(用UL后缀解决)
给出几个例子:1
2
3
4
5
6
7
8
9
10//用#define声明一个常数来表示一年中有多少秒(忽略闰年)
#define SEC_PER_YEAR (60*60*24*365)UL
//用#define声明一个返回两个参数较小值的宏
#define MIN(X,Y) (A)>=(B)?(B):(A)
//考虑
#define PTR int *
PTR a, b; //等价于int *a, b;
int *a, *b;
2、关键字static的作用
C语言中static主要有三个作用:
函数体内,被static修饰的变量在函数内保持值不变;
模块内(函数外),被static修饰的变量成为一个本地全局变量,在模块内可被调用,模块外不可;
模块内,被static修饰的函数可被模块内函数调用。
3、关键字const的作用
const一般用来修饰那些‘只读’的变量,防止变量被修改
const int a; //常整数
int const a; //同上
int const a; //指向整数的常指针
const int a; //指向常整数的指针
int const *a cons; //指向常整数的常指针
4、关键字volatile的作用
volatile用来修饰可能会被意想不到改变的变量,编译器会忽略对被volatile修饰的变量进行优化,每次取变量值都会去地址处取。(编译器优化的变量值会被‘缓存’到寄存器,这样不用每次都去变量地址处取值)
volatile典型应用在三个地方:
中断服务程序中
硬件寄存器
多线程应用中
eg. #define REG_N (volatile unsigned int )0x80000000
5、中断服务函数ISR
有几点需要注意:
没有返回值
尽量避免浮点运算
尽量避免IO操作
6、强制类型转换
- 无符号数operate有符号数=无符号数
eg.1
2
3
4
5void foo(void){
unsigned int a=6;
int b=-20;
(a+b>6)?puts(">6"):puts("<=6") //a+b会强制转换为无符号数:-20转换为无符号数应该是一个很大的值,so...
}