#define _CRT_SECURE_NO_WARNINGS 1
//宏坑很多
//C++建议 const enum inline替代宏
//ADD的宏函数
//宏替换(宏是一种机制替换)
//#define ADD(int a,int b) return a + b;
//#define ADD(a, b) a + b
//#define ADD(a, b) (a + b);
#define ADD(a, b) ((a)+(b))
//宏函数很复杂,容易写出问题,还不能调试
//优点: 高频度调用小函数,写成宏函数,可以提高效率,
//预处理阶段宏会替换,提高效率,不建立栈帧
#include<iostream>
using namespace std;
//默认debug版本下,inline也不展开,为了方便调试
//这里加上inline,这就叫内联函数,下面我们使用这个函数就不是函数调用了(编译器会处理)
//内联缺陷: 代码指令膨胀,可执行程序(安装包)变大
//// 可以通过汇编观察程序是否展开
inline int Add(int x, int y)
{
return x + y;
// 可以通过汇编观察程序是否展开
// 有call Add语句就是没有展开,没有就是展开了
}
int main()
{
int ret1 = ADD(1, 2);//int ret = 1 + 2;
cout << ret1 << endl;
int ret2 = ADD(1, 2) * 3;
cout << ret2 << endl;
//a和b是表达式,表达式中的运算符比+优先级低
int x = 0, y = 1;
ADD(x | y, x & y);// ((x | y) + (x & y));
}

这里我们可以举个例子:inline Func函数,展开后是20行指令,10000个调用的位置:
展开需要多少行指令:10000*20 不展开需要多少行指令:10000+20
C++11 引入的 空指针专用字面量,是一种特殊类型(
std::nullptr_t),专门用于表示 “空指针”,解决了传统NULL的缺陷。
NULL实际是⼀个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
// 本想通过f(NULL)调⽤指针版本的f(int*)函数
// 但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。
f(NULL);
f((int*)NULL);
// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
// f((void*)NULL);
f(nullptr);
return 0;
}void f(int x) { cout << "int 版本" << endl; }
void f(int* p) { cout << "指针版本" << endl; }
int main() {
f(NULL); // 实际调用 f(int),而非预期的 f(int*)(因为 NULL 被解析为 0)
f(nullptr); // 正确调用 f(int*),无歧义
return 0;
}C++11 及以上版本,优先使用 nullptr 表示空指针,彻底替代 NULL,避免歧义。
不要将 nullptr 与整数直接比较(如 if (nullptr == 0) 编译报错),仅用于指针的空值判断:
int* p = nullptr;
if (p == nullptr) { ... } // 正确(判断指针为空)若需兼容 C 语言代码(C 无 nullptr),可保留 NULL;纯 C++ 项目建议全面替换为 nullptr。