C语言在编译的第一个环境,通过调用预处理程序对源文件进行的处理,被称为预处理。
预处理主要是处理以#开头的命令,例如#include <stdio.h>等。预处理命令要放在所有函数之外,而且一般都放在源文件的前面。这种以#号开头的命令称为预处理命令。
指令 | 说明 |
---|---|
# | 空指令,无任何效果 |
#include | 包含一个源代码文件 |
#define | 定义宏 |
#undef | 取消已定义的宏 |
#if | 如果给定条件为真,则编译下面代码 |
#ifdef | 如果宏已经定义,则编译下面代码 |
#ifndef | 如果宏没有定义,则编译下面代码 |
#elif | 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个#if……#else条件编译块 |
#error | 阻止程序编译 |
关于#include
1.#include 实质是什么?
预编译的时候copy include头文件的内容到当前行
2.#include “” 与<> 有何区别?
“”先在当前目录查找有无该头文件,有则包含该目录下的头文件,没有则到系统指定的目录下找该头文件
<>直接到系统指定的目录下查找该文件
3.重复#include时如何防止重复定义/声明?
方案一:
#pragma once
优点:不会出现宏名重复 缺点:某些老的编译器不支持
方案二:
#ifndef XXX
#define XXX
#endif
优点:所以的编译器都支持 缺点:出现宏名重复
一般我们看到大多都是选择方案二,我们只要避免宏名重复就行了
关于宏定义
不带参数的宏定义
所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。
宏定义的一般形式为:#define 宏名 字符串
#include <stdio.h>
#define N 100
int main(){
int sum = 20 + N;
printf("%d\n", sum);
return 0;
}
带参数的宏定义
带参宏定义的一般形式为:#define 宏名(形参列表) 字符串
#include <stdio.h>
#define MAX(a,b) (a>b) ? a : b
int main(){
int x , y, max;
printf("input two numbers: ");
scanf("%d %d", &x, &y);
max = MAX(x, y);
printf("max=%d\n", max);
return 0;
}
关于#error命令
//我们的程序针对Linux编写,不保证兼容Windows,那么可以如下形式编写代码
#ifdef WIN32
#error This programme cannot compile at Windows Platform
#endif
//我们的程序必须以C++方式编译,那么可以
#ifndef __cplusplus
#error 当前程序必须以C++方式编译
#endif