目录
一、预处理器
1、预处理器
预处理器是一个文本替换工具,它会指示编译器在实际编译之前完成所需的预处理。
所有的预处理器命令都以# 开头。
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码(可用于条件编译) |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
2、预定义宏
ANSI C 定义了许多宏。在编程中可以使用这些宏,但是不能直接修改这些预定义的宏。
宏 | 描述 |
---|---|
DATE | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
TIME | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
FILE | 这会包含当前文件名,一个字符串常量。 |
LINE | 这会包含当前行号,一个十进制常量。 |
STDC | 当编译器以 ANSI 标准编译时,则定义为 1。 |
实例
#include <stdio.h>
main()
{
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
}
当上面的代码(在文件 test.c 中)被编译和执行时,它会产生下列结果:
File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1
3、参数化的宏
实例1:取平方
int square(int x) {
return x * x;
}
等价于
#define square(x) ((x) * (x)) //x一定要加括号
实例2:取较大值
#define MAX(x,y) ((x) > (y) ? (x) : (y))
二、头文件
1、头文件
引用头文件相当于复制头文件的内容,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。
2、引用头文件的语法
编译器自带的头文件:
#include <file>
程序员编写的头文件:
#include "file"
3、头文件格式
(1)避免头文件被多次引用,将文件内容放在条件编译语句中。
#ifndef HEADER_FILE
#define HEADER_FILE
#include <...>
#include "..."
#define宏定义
typedef自定义类型
构造类型的声明(如结构体,枚举等)
全局变量的声明(必须加extern)
函数的声明(建议加extern)
#endif
头文件中只能写全局变量的声明,不能定义全局变量,否则在链接时会造成重定义错误。(除非定义成static全局变量,仅在当前文件可见)