版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liunan199481/article/details/82699552
预处理
- 不带参数的宏定义
- 带参数的宏定
- #include语句的用法
- 条件编译命令的使用
- #pragma
- #line
- #undef
- #ifdef #ifndef
- #if
不带参数的宏定义
#define PI 3.14
# | 表示这是一条预处理命令 |
---|---|
PI | 宏名,它是一个标识符 |
3.14 | 字符串,它是代替宏名的真实值 |
* 在编译预处理时,每当遇到PI就自动用3.14替换。
* 注意:程序中出现的字符串中若含有宏名则不进行替换
* 可以用#undef终止宏定义作用域
#define TEST "test"
int main()
{
printf(TEST);
#undef TEST
}
带参数的宏定义
- 例如:
#define MAX(a,b) ((a>b)?(a):(b))
- 带参宏定义特点点:
- (优点)简单函数用带参宏定义,不存在函数调用,可增加代码执行速度
- (缺点)没法进行类型检查,因为不是函数嘛
- (注意)加括号,加括号,加括号,重要的事情说三遍。
#include命令
#include "stdio.h"
#include <stdio.h>
- 上面2个方法有和区别?
- 用<>,系统到存放c/c++库函数头文件所在目录中寻找要包含的头文件。
- 用“”,先在当前目录找要包含的头文件;没有再如上面一样去找。
- 用“”可以使用绝对路径和相对路径
- 这里有关头文件,那么什么内容放在头文件里?
- 宏定义
- 结构体、联合、枚举
- typedef声明
- 外部函数
- 全局变量
- 需要注意的几点:
- 一个include只能包含一个头文件
- 文件包含可以嵌套包含,一个被包含文件也可以包含别的文件
- 若一个文件包含另一个,编译后就成为一个文件,2个文件中的全局静态变量通用,不需要用extern声明。
条件编译
#if 常数表达式
语句块
#endif
- 若常数表达式为真,就编译语句块
int main()
{
int NUM=40;
int i = 0;
#if NUM>20
i++;
#endif
}
- 还可以有else分支,用法同 if else
int main()
{
int NUM=40;
int i = 0;
#if NUM>20
i++;
#else
i--;
#endif
}
int main()
{
int NUM=40;
int i = 0;
#if NUM>20
i++;
#elif NUM>10
i--;
#elif NUM>0
i+=2;
#endif
}
- 个人感觉上面不是太常用,但是下面这些就很常用~
- #ifdef 及#ifndef命令
- 前面 #if 命令需要判断符号常量所定义的具体值,但有时不需要判断具体值,只需要知道符号有没有被定义,这是就采用这种方式定义。
#ifdef USE_TEST_DLL
语句段1
#else
语句段2
#endif
// 若定义了USE_TEST_DLL,则编译语句段1;否则,编译语句段2.
- #ifndef 与其类似
- 在实际开发中,常遇到这种用法,防止头文件被重复包含
#ifndef _TEST_ADD_H_
#define _TEST_ADD_H_
#else
...
#endif
- #line
- 用来改变LINE和FILE的内容,主要是用于调试,不说了。
- #pragma命令
- 作用是设定编译器状态,或者指示编译器完成特定动作
- 后面可跟的参数:
- message:在编译信息输出窗口输出相应信息
- code_seg: 设置程序中函数代码存放的代码段。
- once:保证头文件被编译一次,我们经常会看到,头文件第一行就是 #pragma once
- 这个和上面 #ifndef 功能很像是不是,他们还有一些区别。但是我想说的是上面的 #ifndef 方式是c++标准支持的方式,便于代码的平台移植,这个嘛,编译器支持的,移植代码要看脸喽~**