宏
#include 导入头文件
#if if判断操作符
#elif else if
#else else
#endif 结束if
#define 定义一个宏
#ifdef 如果定义了这个宏
#ifndef 如果没有定义这个宏
#undef 取消宏定义
#pragma 设定编译器的状态
#include <iostream>
using namespace std;
// 解决循环拷贝的问题,互相导入文件循环拷贝
#ifndef CPPCLIONPROJECT_SAFE_QUEUE_TOO_H // 如果没有定义这个宏 一个if
#define CPPCLTONPROJECT_SAFE_QUEUE_TOO_H // 定义一个宏
//第一次进来没问题
//第二次引用进来上门的宏判断就过不去,直接结束。
// 假设有几百行代码在这
#ifndef isRelease // 如果没有isRelease 这个宏 二个if
#define isRelease 0 //是否是正式环境 我就定义isRelease这个宏并且赋值0
#if isRelease == false 三个if
#define DEBUG// 测试环境下
// 三个结束endif
#endif // 结束里面的if
#endif // 结束里面的if
#endif //CPPCLTONPROJECT_SAFE_QUEUE_TOO_H // 属于if范畴必须 结束if
#pragma once //防止重复写include的控制
int main(){
#if 1
cout << "真" << endl;
#elif 0
cout << "假" << endl;
#endif
cout << "只要有if判断就必须写结束endif结束的宏" << endl;
#if DEBUG //是否定义了DEBUG这个宏
cout << "测试环境" << endl; // 前面定义了DBUEG宏,所以输出这个
#else RELEASE
cout << "正式环境" << endl;
#endif // 结束
#ifndef ABCD // 如果没有这个宏就定义这个宏
#define ABCD // 定义这个宏
#ifdef ABCD //是否定义了这个宏
for (int i = 0; i < 6; ++i) {
cout << "abcd 1" << endl;
}
#undef ABCD // 取消这个宏,下面的代码就相当于没有定义ABCD这个宏了
#endif
#endif
return 0;
}
宏预处理和替换
先简单了解C++的大概步骤
#include <iostream>
using namespace std;
// 假如上面的宏的定义在一个文件T1.h中
// 导入该文件,C++第一步预处理就是相当于把上面的那些代码copy到这里,这就是预处理
#include T1.h
#define a 1
int main(){
// 执行第一步的时候进行宏替换,上面定义了a =1
// 下面的代码会直接变成 int i = 1,这就是宏替换
int i = a;
return 0;
}
宏变量与宏函数
#include <iostream>
using namespace std;
// 在真实开发中,宏都是大写
#define VALUE_I 9527
#define VALUE_S "AAA"
#define VALUE_F 545.3F
//宏函数
#define SHOW(V) COUT << V << endl;
#define ADD(n1,n2) n1 + n2
//宏函数的注意事项
#define CHE(n1, n2) n1*n2
#define LOGIN(V) if(V==1) { \
cout << "满足" << endl; \
} else { \
cout << "不满足" << endl; \
}// \是换行, 这个是结尾,不需要加 \
int main(){
// 预处理界面,宏会直接完成文本替换工作
int i = VALUE_I;
string s = VALUE_S;
float f = VALUE_F;
//类似模板函数,根据你的类型变化而变化
SHOW(8);
SHOW(8.0F);
SHOW(8.99);
int r = ADD(1,2);
cout << r << endl;
r = ADD(1+1,2+2);// 6
// 我们认为是8,其实r = 5
// 文本替换之后 1+1*2+2 = 5
r = CHE(1+1,2+2);
// 宏函数优点,不会有函数进栈弹栈,直接是文本替换
// 缺点,文本替换导致体积增大,调用一次是文本替换一次
LOGIN(0);
LOGIN(0);
LOGIN(0);
LOGIN(0);
return 0;
}