C语言预处理命令常见问题
一、宏定义#define
宏定义就是用一个字符来表示一个字符串,让程序更简明,同时也便于修改,如#define PI 3.1415926 这样的都很常见,也不会产生什么问题,容易出现问题的就是带参数的宏定义,例如
#define S(x) x*x
如果x=10,很明显S(10)=1010;但是如果说x=a+b,此时S(x)=a+ba+b,显然和我们预想的不一样,如果这样定义,则可以达到目的
#define S(x) (x)*(x)
当x=a+b时,则S(x)=(a+b)*(a+b),这样就和预想的一样了。
二、文件包含
我们会经常看到#include<stdio.h>和#include”stdio.h”这样两种书写方式,这两种方式都是合法的,区别就是用尖括号时,系统到存放C库函数头文件目录中寻找包含的文件,这种称为标准方式。用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式来查找。一般调用库函数用尖括号,而调用自己编写的文件用双引号,如自己编写的文件不在当前目录,需要加上路径,如#include”D:\ex\ex1.h”。
三、条件编译
例1:#ifdef DEBUG
printf(“This is debug mode”);
#else
printf(“This is not debug mode”);
#endif
如果这组条件编译命令之前曾出现了 #define DEBUG 或者 #define DEBUG 0,也就是只要“DEBUG”被定义了,在编译时就编译printf(“This is debug mode”),否则就编译printf(“This is not debug mode”)。
这样的话就可以避免一些不必要的编译,同时,如果不是用debug模式的时候,只需要将#define DEBUG删除即可,不需要删除里面程序,方便调试。
例2:#ifndef DEBUG
printf(“This is debug mode”);
#else
printf(“This is not debug mode”);
#endif
这种形式正好和上面的相反。
例3:#if DEBUG
printf(“This is debug mode”);
#else
printf(“This is not debug mode”);
#endif
如果这组条件编译命令之前曾出现了 #define DEBUG 1,在编译时就编译printf(“This is debug mode”),如果出现#define DEBUG 0,在编译时就编译printf(“This is not debug mode”)。
采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间,同时也给调试带来了很大的方便,另外在程序的移植等方面也带来很大的灵活性。
在DSP的开发中,在其头文件中会看到如下类似的条件编译
#ifndef DSP2833x_DMA_H
#define DSP2833x_DMA_H
代码
#endif
这样的话,可以防止该头文件被重复的编译,影响编译时间等。