1. 预编译:在编译之前,直接替换相应的代码文本
2. 编译:形成目标文件 .obj
3. 连接:将目标代码与C函数库连接合并,形成最终的EXE文件
头文件告诉编译器存在这样的一个函数,连接器负责找到这个函数
#include <stdio.h>//把代码包含进来
void main(){
#include "my.txt"
; getchar();
}
my.txt的内容为printf("%s","abcdafdafdafafdafd")
define 可以定义(仅仅是文本替换) :
1.定义标示
#ifdef __cplusplus 表示支持C++ 语法
2.定义常数
#define MAX 100
3.定义“宏函数”
//__VA_ARGS__ 可变参数标示
#define log(args,...) printf(args,__VA_ARGS__);
##运算符
##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
#defineNUM(a,b,c)a##b##c
#error指令将使编译器显示一条错误信息,然后停止编译。
#line指令可以改变编译器用来指出警告和错误信息的文件号和行号。
#pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。
防止文件的重复引入
#pragma once 头文件只被包含一次,让编译器自动处理好循环包含的问题
条件编译
1:情况1:
#ifdef _XXXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
例:
#define NUM
.............
.............
.............
#ifdef NUM
printf("之前NUM有过定义啦!:) ");
#else
printf("之前NUM没有过定义!:( ");
#endif
}
如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
2:情况2:
#ifndef _XXXX
...程序段1...
#else
...程序段2...
#endif
这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
3:情况3:
#if 常量
...程序段1...
#else
...程序段2...
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。