小赖子的英国生活和资讯

C++中的assert和static_assert的区别

阅读 桌面完整版

C++ assertstatic_assert 的区别

C++ 提供了两种机制来验证程序中的假设(断言):assertstatic_assert。虽然它们看起来类似,但它们在不同的阶段工作,并且用途也不同。

🔍 assert — 运行时检查/断言

assert 用于在程序运行时验证条件是否成立。如果条件为假,程序会打印错误信息并中止运行。

#include <cassert>

int divide(int x, int y) {
    assert(y != 0);  // 如果 y 为 0,程序会中止
    return x / y;
}

assert 通常只在调试模式下启用,如果定义了 NDEBUG,这些断言会被禁用。

🧱 static_assert — 编译时检查/静态断言

static_assert 在编译期间检查条件是否成立。如果条件不满足,编译器会直接报错,阻止程序编译。

static_assert(sizeof(int) == 4, "此代码假设 int 是 4 字节");

它要求条件是一个常量表达式,特别适合在模板、类型检查或平台限制中使用。

📊 对比表

特性 assert static_assert
检查时机 运行时 编译
是否可被禁用 可以(通过 NDEBUG 不可以
是否需要常量表达式 不需要 需要
失败时表现 程序中止 编译失败
主要用途 调试时的逻辑检查 编译时的类型或平台验证

💡 使用建议

总结

assertstatic_assert 都能帮助你更早地发现程序中的问题,但它们发生的时间点不同。static_assert 更适合在编译阶段做静态验证,而 assert 更适合在调试阶段检查运行时逻辑。

C/C++编程

英文:C++ assert vs static_assert

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version