<C - 预处理> 2017-12-07
01、预处理:
//#pragma once // 防止文件重复包含 #ifndef _SUMMER_H_ // 第一次包含的时候 _SUMMER_H_ 没有定义 所以会包含里面所有内容 #define _SUMMER_H_ // 第一次包含的时候会定义这个宏 // 第二个包含的时候这个宏已经 int fun(int x) { return x; } #endif /* _SUMMER_H_ */
#include <stdio.h> #include "summer.h" #include "summer.h" #include "../summer.h" // 头文件包含也可以使用路径 ../cpp文件夹的上级目录 #include <string> #define PI 3.1415926 #define Max 3+4 #define snFun "你好" #define ADD(a,b) (a+b) // 先替换 在计算 #define MUL(a,b) (a*b) // 打印 y 和y 的值 #define PRINT(y) printf("变量"#y"的值是%d",y) // #y -->(相当于) "y" #define M(x) pic##x // M(1) --> pic1 /* 其他的预处理命令 */ #ifndef PI #define PI 3.141592654 #else #undef PI // 取消原有的宏定义 #define PI 3.141592654 #endif /* ** 文件操作 w r a ** ** ** 预处理命令 #include ** 写完代码 --> 可执行文件 ** 预处理 编译 汇编 连接 ** 预处理 主要分为以下: ** 1.宏定义 #define ** 2.文件包含 #include ** 3.条件编译 %if ** ** 1.宏定义 ** #define PI 3.1415926 ** 在预处理阶段 PI 换成 3.1415926 替代的内容可以是 常量 字符串 或者表达式都可以 ** 1.1 带参数的宏定义 ** 计算a + b 的值 ** #define ADD(a,b) a+b ** 没有类型 比函数稍微方便 ** 如果是一些比较长的代码 --> 函数 ** 带参数宏定义 没有递归 ** --> 先替换在计算 ** 1.2 两个操作符(主要用于参数) ** # 连接字符串 sharp ** ## 给变量取名字 ** 2.文件包含 ** #include <文件名> ** #include "文件名" ** 2.1.<>和""的区别 ** 寻找 <> 在include 路径中寻找头文件 没有找到(无法打开头文件) ** "" 项目文件夹中找 若没有找到 再去系统的头文件中找(都没有找到再显示没有打开) ** ** <>范围比较小 "" 比较大 ** 系统自己已有的头文件 <> 比较快 ** ** 2.2.头文件名字 ** shdio.h C语言头文件文件的命名方式 --> cstdio 去掉.h 前面加c ** cmath cstdlib ** iostream C++头文件 ** ** string 没有.h C++ ** string.h --> cstring ** 2.3 文件包含 头文件的内容复制到包含的位置 ** --> 防止文件重复包含 代码:#pragma once // 让头文件只包含一次 ** ** 3.条件编译 ** 预处理过程中 根据条件决定是否编译 ** #if 条件1 ** ** #endif ** 可以使用#elif 条件 ** #else ** 也可以使用#if嵌套 ** ** ** ** #ifndef if not define 重点是:防止文件重复包含 ** 4.其他的预处理命令 ** 4.1 #undef 取消宏定义 ** 4.2 #if defined PI 和#ifendef 相反 ** #if !defined PI 和 #ifndef PI 相同 ** 4.3 #pragma ** #pragma once // 头文件治只包含一次 ** #pragma commment(lib,"winmm.lib") // 连接一个库 ** #pragma pack(n) // 设置结构体对齐方式 */ int main() { #if 0 // 宏定义 int x = 68; PRINT(x); getchar(); int M(1), M(x); // 定义 pic1 picx picx = 123; // 也可以这样写:M(x) = 123 printf("%d\n", 5 * ADD(3, 4)); // --> 5*3+4 printf(snFun); printf("\n%.10lf", PI); #elif 0 // 头文件包含 fun(1); #elif 1 // 条件编译 #endif getchar(); return 0; }
01、测试:
#include<stdio.h> //#define _CRT_SECURE_NO_WARNINGS //定义一个宏 去掉安全检查 (不用新函数) 新版VS已经不能用了 int main() { int x; scanf("%d", &x); getchar(); getchar(); return 0; }