目录
一:预定义符号
__FILE__ // 进行编译的源文件__LINE__ // 文件当前的行号__DATE__ // 文件被编译的日期__TIME__ // 文件被编译的时间__STDC__ // 如果编译器遵循 ANSI C ,其值为 1 ,否则未定义
int main()
{printf("%d\n",__FILE__);
printf("%d\n",__DATE__);
printf("%d\n",__LINE__);
printf("%d\n",__TIME__);
printf("%d\n",__STDC__);
return 0;
}
如果__STDC__报错,那么便是不支持ANSI C,还有很多类似的预处理命令
二.#define 定义标识符
1.语法:
#define name stuff
2.用法:
#define MAX 1000
#define reg register //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ , \
__DATE__,__TIME__ )
提醒:使用#define的时候最后最好不要加上;可能引起;;问题,如:
#define M 15;
int main()
{
int a=M;//这样编译器就会报错 在预处理阶段此语会被替换为int a=15;;
return 0;
}
三.#define 定义宏
#defifine 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏( macro )或定义宏( defifinemacro )。
1.声明方式:
#define name( parament
-
list ) stuff
注意:name的后面的(与name要紧挨着
#define ADD(a,b) ((a)+(b))
int main()
{int a=ADD(1,2);
return 0;
}
注意:1.同时为了避免未知的错误应不吝啬括号
2. 宏不建议使用带有副作用的参数,如(a++)
2.#和##
(1).# 把宏参数转变成字符串
#define MAX(n) #n
int main()
{char*p=MAX(1111);
printf("%s",MAX(1111));
}
成功打印1111
int i = 10;
#define PRINT(FORMAT, VALUE)\
printf("the value of " #VALUE "is "FORMAT "\n", VALUE);//将VALUE的值变成字符串
int main(){
PRINT("%d", i+3);
(2).## 将两边的数之间连接成一个数(必须在定义宏的时候使用,且两边的宏参数不能带括号)
#define MAX(a,b) a##b
int main(){
printf("%d",MAX(1,2));
}
3.宏的缺点:
(1.每次使用宏时会插入一份宏定义1点代码,所以宏不能太长,不然可能大幅度增加程序长度
2.真正执行的代码与调试时的所看到的代码不同,不能调试
3.宏由于类型无关,不够严谨
4.宏可能回带来运行优先级的问题,容易出错
注:宏可以做到的函数可能做不到,宏和函数各有优劣
4.命名约定
(1).宏名全大写(有例外,如offsetof)
(2).函数名不要全大写
四.#undef 除宏定义
这条指令用于移除一个宏定义
#undef NAME
五.条件编译
条件编译指令
1.#if 常量表达式//...#endif// 常量表达式由预处理器求值。如:#define __DEBUG__ 1#if __DEBUG__//..#endif2. 多个分支的条件编译#if 常量表达式//...#elif 常量表达式//...#else//...#endif3. 判断是否被定义#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol4. 嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif#endif
六.文件包含
1.防止头文件被重复调用的方法
每个头文件这么写
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif //__TEST_H__
或者
#pragma once
2.头文件包含
(1)." "在目标目录底下查找
(2).< >在库函数目录底下查找