标题用人话说就是预处理指令
1.空指令
先水一个
#
对,就这一个,没有任何作用
2.#include
注意所有预处理指令没有;
#include <header> // 系统头文件
#include "file.h" // 用户头文件
引用系统头文件或用户头文件,会第一个就行(第二个没用)
3.#define宏定义
(1)定义标识符
#define+名称+代替的东西(也可以没有)
下次using namespace std;
可以写成 INDEFINE namespace std;了
#define IDENTIFIER // 定义标识符
#define INDEFINE using
也可以指代数字或算式
#define LING 0
#define YEH 1+2
怎么用?
#include<bits/stdc++.h>
#define SDS 3+4
int main(){
int a=SDS;
printf("%d",a);
return 0;
}
输出7
(2)带参数的宏
约等于函数
#include<bits/stdc++.h>
#define DF(a) a+3
int main(){
int b=6;
std::cout<<DF(b);
return 0;
}
输出 9
(3)defined()
有个小函数defined(),判断宏是否被定义
4.#undef
#undef+已经定义过的宏名称,表示取消宏定义
人话:把它删了
#undef IDENTIFIER // 取消宏定义
5.#line行控制指令
先写个好写的,一点也不常用,直接看示例吧
#line number "filename" // 设置行号和文件名
// 常用于代码生成工具
6.#pragma
唯一真神,开O3或O2优化后就不TLE了(代码看A+B600多行的那篇)
还有这些作用
#pragma once // 防止头文件重复包含
#pragma pack(n) // 设置结构体对齐
#pragma warning(...) // 控制警告(MSVC)
#pragma GCC optimize(...) // 优化设置(GCC)
#pragma clang diagnostic... // 诊断控制(Clang)
其实还能当错误和警告指令用(后面会讲)
7.条件编译指令
可以放在函数或主函数中
#ifdef IDENTIFIER // 如果已定义
#ifndef IDENTIFIER // 如果未定义
#if constant_expression // 如果条件为真
#elif constant_expression // 否则如果
#else // 否则
#endif // 结束条件编译
作用:检查宏是否已定义
#include <iostream>
// 检查宏是否已定义的不同方式
#define FEATURE_X
int main() {
// 方式1:使用 #ifdef
#ifdef FEATURE_X
std::cout << "FEATURE_X 已定义(使用 #ifdef)" << std::endl;
#endif
// 方式2:使用 #if defined()
#if defined(FEATURE_X)
std::cout << "FEATURE_X 已定义(使用 #if defined())" << std::endl;
#endif
// 检查多个条件
#if defined(FEATURE_X) && !defined(DISABLE_FEATURE)
std::cout << "功能X启用且未被禁用" << std::endl;
#endif
return 0;
}
#if,#elif,#else几乎可以当if else if else用,只不过要跟宏有关,并且需要#endif
8.错误与警告指令
#error message // 产生编译错误
#pragma message("msg") // 输出编译消息(MSVC)
#warning message // 产生编译警告(GCC/Clang)
也没啥用,知道就行
9.预定义宏
不用定义,直接用即可
__LINE__ // 当前行号
__FILE__ // 文件名
__DATE__ // 编译日期
__TIME__ // 编译时间
__cplusplus // C++标准版本
__func__ // 当前函数名(C++11)
__VA_ARGS__ // 可变参数宏
再见!

3082

被折叠的 条评论
为什么被折叠?



