编译时检查vs运行时检查

VS编译间接引用的DLL不一定输出 如果A引用B,B引用C,那么A对C就是间接引用,一般的编译A时会输出B的DLL,而因为B对C有引用,所以也会输出C的DLL。但是实际编译时发现,并不一定都会输出C的DLL。后面不断的追查原因,最终发现是与B对C引用时代码的调用有关。如果B对C的调用都是常量的方式,比如C中都是CONST常量,或者B只调用了C的CONST常量。那么编译的时候,B不会带上C的引用,这个可以ildasm工具,去查看B的D... 阅读详情

一、编译时检查vs运行时检查

特性编译时检查运行时检查
发生时间程序运行之前(编译阶段)程序运行期间
检查内容语法、类型、访问权限、函数签名等数组越界、空指针、除零、文件不存在、网络中断等
执行者编译器(如 GCC, Javac, TypeScript Compiler)程序本身或运行时环境(如 JVM, CLR)
错误类型编译错误(Compilation Error)运行时异常/错误(Runtime Exception/Error)
对程序的影响程序无法生成可执行文件,必须修复错误才能运行。程序已经运行,可能导致崩溃、异常或未定义行为。
性能增加编译时间,但不影响运行时性能。增加运行时的开销,因为需要在代码执行时进行判断。
确定性高。只要代码不变,检查结果就是确定的。低。依赖于运行时的输入、环境状态等。
主要目标保证代码的正确性和结构性,提前发现大量低级错误。保证程序在不确定环境下的健壮性和容错能力。
典型语言Java, C#, C++, TypeScript, Go(静态类型语言)JavaScript, Python, Ruby(动态类型语言),以及所有语言的运行时校验

二、举例说明:

2.1 编译时检查

2.1.1 语法错误

#include <iostream>
using namespace std;

int main() {
    int x = 5
    // 编译错误:缺少分号
    // error: expected ';' after expression
    return 0;
}

2.1.2 类型错误

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name = "Alice";
    int length = name.length(); // 正确
    
    // 编译错误:类型不匹配
    string result = 42; // error: cannot convert 'int' to 'std::string'
    
    return 0;
}

2.1.3 函数签名错误

#include <iostream>
using namespace std;

void printNumber(int x) {
    cout << "Number: " << x << endl;
}

int main() {
    printNumber(10);     // 正确
    printNumber("hello"); // 编译错误:参数类型不匹配
    // error: could not convert '("hello")' from 'const char*' to 'int'
    
    return 0;
}

2.1.4 模板实例化检查

#include <iostream>
using namespace std;

template<typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << add(5, 3) << endl;    // 正确:int + int
    cout << add(2.5, 3.7) << endl; // 正确:double + double
    
    // 编译错误:没有匹配的运算符
    struct Point { int x, y; };
    Point p1{1,2}, p2{3,4};
    // auto result = add(p1, p2); // error: no match for 'operator+'
    
    return 0;
}

2.1.5  constexptr检查

#include <iostream>
using namespace std;

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

int main() {
    // 编译时计算
    constexpr int result = factorial(5); // 在编译时计算 5!
    cout << "5! = " << result << endl;   // 输出 120
    
    // 编译错误:constexpr 函数参数必须在编译时可知
    int n = 5;
    // constexpr int bad = factorial(n); // error: 'n' is not a constant expression
    
    return 0;
}

2.2 运行时检查

2.2.1 数组越界

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3, 4, 5};
    
    // 使用 at() 方法进行运行时边界检查
    try {
        cout << numbers.at(2) << endl;  // 正确:输出 3
        cout << numbers.at(10) << endl; // 运行时异常:越界访问
    }
    catch (const out_of_range& e) {
        cout << "捕获到异常: " << e.what() << endl;
    }
    
    // 使用 [] 运算符(通常无边界检查)
    cout << numbers[2] << endl;  // 正确:输出 3
    cout << numbers[10] << endl; // 未定义行为!可能崩溃或输出垃圾值
    
    return 0;
}

2.2.2 动态类型转换

#include <iostream>
using namespace std;

class Animal {
public:
    virtual ~Animal() = default;
};

class Dog : public Animal {
public:
    void bark() { cout << "Woof!" << endl; }
};

class Cat : public Animal {
public:
    void meow() { cout << "Meow!" << endl; }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();
    
    // 运行时类型检查:dynamic_cast
    if (Dog* dog = dynamic_cast<Dog*>(animal1)) {
        dog->bark(); // 会执行:animal1 确实是 Dog
    }
    
    if (Dog* dog = dynamic_cast<Dog*>(animal2)) {
        dog->bark(); // 不会执行:animal2 是 Cat,不是 Dog
    } else {
        cout << "animal2 不是 Dog 类型" << endl;
    }
    
    delete animal1;
    delete animal2;
    return 0;
}

2.2.3 除零检查

#include <iostream>
#include <stdexcept>
using namespace std;

double divide(int a, int b) {
    if (b == 0) {
        throw runtime_error("除零错误");
    }
    return static_cast<double>(a) / b;
}

int main() {
    try {
        cout << divide(10, 2) << endl;  // 正确:输出 5
        cout << divide(10, 0) << endl;  // 运行时异常
    }
    catch (const runtime_error& e) {
        cout << "捕获到异常: " << e.what() << endl;
    }
    
    return 0;
}

2.2.4 文件操作检查

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream file("不存在的文件.txt");
    
    // 运行时检查文件是否成功打开
    if (!file.is_open()) {
        cout << "无法打开文件!" << endl;
        return 1;
    }
    
    string content;
    while (getline(file, content)) {
        cout << content << endl;
    }
    
    // 检查文件读取状态
    if (file.bad()) {
        cout << "文件读取过程中发生错误" << endl;
    }
    
    file.close();
    return 0;
}

2.2.5 智能指针为空检查

#include <iostream>
#include <memory>
using namespace std;

class Resource {
public:
    void use() { cout << "使用资源" << endl; }
};

int main() {
    unique_ptr<Resource> ptr1 = make_unique<Resource>();
    unique_ptr<Resource> ptr2 = nullptr;
    
    // 运行时检查指针是否为空
    if (ptr1) {
        ptr1->use(); // 会执行
    }
    
    if (ptr2) {
        ptr2->use(); // 不会执行
    } else {
        cout << "ptr2 是空指针" << endl;
    }
    
    return 0;
}

三、总结

在 C++ 中,良好的编程实践是:

  • 尽可能在编译时发现问题(使用强类型、static_assert 等)

  • 对不可避免的运行时错误进行适当处理(异常处理、错误码等)

  • 使用工具如 ASan、UBSan 等来检测未定义行为

变压器耦合放大器(低频应用+高频应用) 阅读详情

相关推荐

基于MicroPython的ESP32与微信小程序MQTT通信实战

本文详细介绍了基于MicroPython的ESP32与微信小程序通过MQTT协议实现远程控制的完整实战方案。项目利用巴法云作为免费MQTT服务器,提供了从设备端编程、小程序开发到通信调试的全流程指南,帮助开发者快速构建低成本、易上手的物联网应用,如智能开关、传感器监控等。

week9的博客 634

Visual Studio中SDK、目标包、运行时包的区别

目标包:在 Visual Studio 和其他一些开发环境中进行开发时,允许应用定位 .NET Framework 的特定版本。开发人员包(SDK):包括 .NET 框架的特定版本及其随附的 SDK 及其相应的目标包。 换句话说,例如:SDK 4.7.1 包括 。NetFramework 4.7.1 和目标包 4.7.1。但是,如果要定位 .Net Framework 4.6,则需要安装目标包 4.6 目标包用于当你安装了高版本sdk需要定位到低版本的情况下需要安装的一种包。这种包可以在需要的情况下让你可

tiankongzhicheng441x的博客 5106

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置(附eNSP源文件)

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置 一、实验概述 二、交换机的配置 2.1 二层交换机的配置 2.2 三层交换机的配置 三、路由器的配置 四、实验结果 五、实验总结 一、实验概述 按照以下的拓扑连接,自行设计VLAN和IP地址等网络参数,实现PC1到PC2的IP通信。其中,R1,R2为路由器;LSW1,LSW4为3层交换机;LSW2,LSW3 ,LSW6, LSW7为2层交换机;CLIENT1-CLIENT12为PC机。 拓扑图 课程设计要求:(1)IP地址自行规划设计,应该清晰地

qq_43757282的博客 4万+

VS studio上查看标准cout输出

顾名思义,这个方法是在生成结束后,使用命令行执行生成的exe程序,暂且不说因运行环境问题程序能不能运行起来的问题,对于GUI程序或者使用debug来调试是不适用的!在生成事件->生成后事件->命令行(Build Events->Post-Build Event->Command) Line)中增加。可见当文本的编码不是UNICODE时,还会报错,那么此时可以直接调用。在解决方案管理器中,单击选中项目后,点击菜单【视图】->【属性页】直接使用qDebug()输出即可,输出窗口设置如下。

maoxinfeng的专栏 1267

矩形口径喇叭天线设计——参数设置

我们建立好矩形口径喇叭天线的模型后(模型建立可参考B站相关视频或者李明洋的《HFSS天线设计》),如何修改参数达到我们的指标呢?

m0_57263863的博客 1万+

射频接收机本振相噪指标计算:从倒易混频到GSM实战

在射频接收机设计中,相位噪声是衡量本振信号频谱纯度、影响系统灵敏度的关键指标。其核心影响机制源于倒易混频原理:当不纯净的本振信号与强带外阻塞信号混频时,本振的噪声边带会被转换到中频通带内,从而抬升接收机噪声基底。这一过程直接决定了接收机在阻塞测试等场景下的性能极限。从技术价值看,精确计算本振相噪要求,是进行系统噪声预算、实现成本与性能权衡的核心依据。尤其在手机、基站等对灵敏度要求极高的应用中,它指导着锁相环和压控振荡器的选型与设计。本文以经典的GSM DCS1800标准为例,通过详细的公式推导与变量分析,演

weixin_30368405的博客 327

善用 vs 中的错误列表和输出窗口,高效查找 C++ 多工程编译错误

原总结排错vs编译错误错误列表输出窗口 前言 相信,绝大多数小伙伴儿编译 C++ 或者其它语言的程序都遇到过编译错误。今天简单总结一下如何使用错误列表(Error List)和输出窗口(Output)排查编译 C++ 代码产生的编译错误。简单的错误,通过错误列表就可以搞定,但是一些复杂的错误,只通过错误列表很可能是无法解决的,需要借助输出窗口的帮助。 错误列表 错...

1万+

软考中级-系统集成项目管理工程师**的超详细知识点笔记。

软考中级系统集成项目管理工程师核心知识点摘要 综合知识:涵盖信息化基础(国家信息化六要素、信息系统开发方法)、系统集成特点(高技术性、团队协作)、IT服务管理(ITIL流程)、网络技术(OSI模型、TCP/IP)、信息安全(CIA三要素、加密技术)、软件工程(生命周期、测试类型)、面向对象分析与设计(UML图)、新一代信息技术(云计算、大数据、物联网)。 案例分析:聚焦项目管理十大知识领域,重点包括: 整体管理(项目章程、变更控制流程) 范围管理(WBS分解、需求跟踪矩阵) 进度管理

最爱で毛毛熊的博客 1990

带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑

Windows下**C Runtime Library**是微软对C标准库函数的实现,这样每个程序可以直接使用C标准库的函数;后来出现了C++,于是又在C Runtime Library基础上开发了**C++ Runtime Library**,实现了对C++标准库的支持。因此现在Windows下的C/C++运行时库既包含子C标准库,也包含了C++标准库。如果你安装了VS2010,在安装目录下的VC\crt\src下

阳光日志 5万+

如何从 VMware 官网下载最新版本的 VMware Workstation

如何从 VMware 官网下载 VMware Workstation

XiaoqiangClub的博客 5909

【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI)

追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。

奶爸的编程之路,也就一周冷个三天 1122

经验:VS2017运行时出现“调用目标发生了异常”时的解决方法

VS2017环境具备代码提示功能,与之前的版本相比,不用再安装编程助手,这是使用中感觉最方便的地方。 不稳定的地方有很多,其中一条是:“调用目标发生了异常” 暂时的解决办法: 1. 在开始菜单,找到“Visual Studio Tools”文件夹中的“VS 2017的开发人员命令提示符” 运行。 2. 输入:devenv /Safemode 3. 以安全模式启动运行。 大家还有其它办...

qq_41708281的博客 4260

Sigrity Power Tree如何进行直流压降仿真分析操作指导

Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。

weixin_54787054的博客 732

VS2010工程迁移到VS2013(或VS2015)遇到的SDL问题

该编译选项在VS2013及以后版本,默认为开启状态。故将VS2010的工程迁移到VS2015时,就会触发与它相关的编译错误(不管是通过“双击.sln文件”自动升级,还是新建工程,拷贝代码的方式)。 最常见的编译错误是上表列出的“C4996”——“使用标记有deprecated函数”。 这些被启用的函数包括:“strcpy”等字符串操作函数和”inet_addr“等socket函数。解决的办法有两种:一是使用新的微软推荐的安全函数逐个代替这些被弃用的函数;二是将SDL编译选项关

Sagittarius_Warrior的博客 5724

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

什么叫编译时和运行时

以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了

jueng 786

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C/C++ assert 与 static_assert 对比解析:3大差异与编译时检查实战

本文深入对比了C/C++中的`assert`与`static_assert`,解析了它们在运行时与编译时检查中的3大核心差异。通过实战示例展示了如何在不同场景中选择合适的断言机制,帮助开发者提升代码的健壮性和调试效率。特别适合需要优化调试流程和编译时验证的C/C++开发者。

464

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

编译时类型检查与运行时类型检查

编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器) 那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法

u013298353的专栏 3490

编译时和运行时

http://blog.youkuaiyun.com/weiwenhp/article/details/8107203 以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是

xiadidi的专栏 691

VS 静态链接lib和动态链接dll的使用以及error link2019无法解析外部符号和error link2001错误

VS 静态链接lib和动态链接dll的使用以及error link2019无法解析外部符号和error link2001错误 静态链接lib和动态链接dll 首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,共同点在于代码共享。 静态库:在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多...

weixin_40426734的博客 3521

嵌入式开发板视觉实战:从图像采集到模型部署的完整链路

嵌入式视觉是物联网与人工智能交叉领域的热门方向,其核心挑战在于如何让算力有限的开发板完成从图像采集到目标检测的完整闭环。图像采集涉及传感器接口、帧缓冲管理与时序调度,而模型部署则需要经过轻量化设计、INT8量化与推理引擎适配等环节。理解这一链路的技术原理,有助于开发者根据场景需求在ESP32-S3、星宸科技及RK3588等平台间做出合理选型,并规避花屏、帧率低下与检测失效等典型问题。无论是课程设计还是产品原型,掌握从硬件选型到模型迁移的工程方法,都能显著提升嵌入式视觉项目的落地效率。本文围绕这一主题,系统梳

weixin_34032792的博客 336

编译时和运行时的关系

以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了

puppet_master的专栏 782

VS C++ 配置问题

右键解决方案里面的项目 最下面的属性 进入如下属性页 1.VS版本不对就改这个页面的windows sdk 和 平台工具集 Debug表示正在配置的是Debug,也可以改成Release 平台同理 关系你调试时的选择 2.编译时头文件没得就点左边VC++目录 配置包含目录选项 库文件么得就配库目录 附加库就去连接器里配附加库目录 3.运行时弹框提示么得库 多半是...

LucifeR_Shun的博客 608

关于VS的几个问题

<br />1、VS2008编译时出现:“error PRJ0003 : 生成 cmd.exe 时出错 ”的问题<br />解决方案一:工具—>选项—>项目和解决方案—>VC++目录,在可执行文件栏中加上如下三条路径:$(SystemRoot)/System32<br />                  $(SystemRoot)<br />                  $(SystemRoot)/System32/wbem<br />解决方案二:把$(PATH)改成:$(SystemRoot)/

降龍 703

精通Silverlight——11.3 处理异常和错误

    在Silverlight应用程序开发的过程中,出现错误的在所难免的,幸运的是VS2008提供了大的智能感知能力,在编译时期就能将错误进行识别,并给出醒目的提示,当为XAML属性赋了不正确的值时,XAML编辑器会以波浪线提示错误,如图所示。当使用.NET编程时,VS2008提供了编译时检查功能,对于后置代码的语法错误会提示编译失败。对于一些应用程序逻辑上的错误,则可以借助

Silverlight 876

关于现代C++中std::variant与std::any的综合技术报告

**本文对比分析了C++17中的std::variant和std::any两种类型安全容器。std::variant作为编译时确定的类型安全联合体,具有高性能和编译时类型检查的优势,适用于状态机等场景;而std::any作为运行时类型安全的通用容器,提供了更大的灵活性但性能较低,适合插件系统等需求。报告建议优先使用std::variant,仅在无法预知类型时选择std::any。两者在内存管理、访问方式和适用场景上存在显著差异,开发者应根据具体需求权衡选择。

greenspan的专栏 1399
上一篇: 深拷贝vs浅拷贝,引用传递vs值传递vs指针传递
下一篇: C/C++八股(持续更新)
10710
博客等级 码龄6年 1168粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值