宏定义#define、const和constexpr

宏定义#define

用于预处理器文本替换,常用于定义常量、函数宏、条件编译、跨平台特性、简单代码生成和编译器内置的宏使用。
缺点是没有类型检查,容易出错,不遵守作用域规则(全局生效,可用 #undef取消)。
建议只是在条件编译和跨平台特性区分上使用,常量建议用const或 constexpr替代,函数宏用内联函数替代。

条件编译​​:配合 #ifdef、#ifndef等防止重复包含头文件。
#ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件内容
#endif

​​跨平台编译​​:根据平台定义不同行为。
#ifdef linux
// Linux特定代码
#elif defined(_WIN32)
// Windows特定代码
#endif

​​日志调试​​:使用 FILE、__LINE__等编译器内置宏。
#define LOG(msg) std::cout << FILE << “:” << LINE << " " << msg

// 条件编译
#ifdef DEBUG // 编译开关
#define LOG(msg) std::cerr << msg
#else
#define LOG(msg)
#endif

// 平台特性抽象
#if defined(linux)
#define PLATFORM_API LinuxAPI() // 跨平台封装
#elif defined(_WIN32)
#define PLATFORM_API WinAPI()
#endif

// 简单代码生成
#define DECLARE_ID(Name)
struct Name##Id { int value; }; // NameId生成

// 编译器内置宏使用
#define ASSERT(cond)
if(!(cond)) throw std::runtime_error(
FILE “:” LINE_STRING " Assertion failed") // 文件/行号

const:运行时只读常量​

用于只读保证,值在运行时初始化且不再改变。
类型安全,编译器会做类型检查。
有作用域限制(如命名空间、类内部、函数内部)。
可修饰变量、指针、引用、成员函数等。
​​运行时常量性​​:某些情况下值在运行时确定。

// 运行时初始化常量
const int width = GetScreenWidth(); // 运行时确定

// 函数参数只读保证
void Print(const std::string& str); // 承诺不修改

// 类常量成员(需构造函数初始化)
class Circle {
public:
Circle(double r) : radius® {} // 构造时初始化
const double radius;
};

// 指针常量化
const char* protocol = “HTTP/1.1”; // 内容不可变
char* const ptr = buffer; // 指针不可变

constexpr关键字​

C++11引入,用于​​编译时常量​​和​​常量表达式函数​​。要求值或函数在编译时就可计算。支持整数、浮点数、自定义类型(如果满足字面值类型要求)。
编译器验证与优化(编译时计算),类型安全,支持作用域和命名空间,可应用于函数和表达式。
当多个.cpp文件包含某头文件时,每个编译单元都会有自己的const 常量副本,共有同一个constexpr常量。
在编译是就确定的量,建议用constexpr。

// 需要编译时计算的常量
constexpr int SIZE = 100;
int array[SIZE]; // 用于数组大小

// 编译时数学计算
constexpr double PI = 3.1415926;
constexpr double RAD_TO_DEG = 180.0 / PI; // 编译时计算

// 模板元编程
template
struct Buffer { std::array<int, N> data; }; // 模板参数

// 编译时类型安全转换
constexpr auto value = std::bit_cast(0x40490FDB); // IEEE 754转换

总结:

宏仅用于条件编译和跨平台控制​​。
const声明运行时常量​​(如函数内、构造函数初始化等)。
当编译器就能确定时,优先选择 constexpr代替 const​​。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值