C/C++的注意事项

【实用篇】22条 C/C++ 注意事项 【实用篇】22条 C/C++ 常用注意事项,刷题考试时,再也不爆零! 阅读详情

         最近调试C语言程序,出了一些错误,费了很大的力气才找到这些BUG。现在把这些错误记录下来,同时做一些编程上的原则上的约束,希望能达到两个目的:(1)看到类似的情况,能马上定位知道是什么错误。(2)不在犯这种错误。

         将64位整型转换为32位整型,貌似是没什么问题。但是在做多结点间数据通信的时候,这个不注意的细节将导致很严重的错误。例如在发送端使用的是64位的整型,接收端使用32位整型,这样会导致接收端由于接收缓冲区中的数据没有完全被反序列化阻塞。

        还有使用无符号数的时候一定要注意,因为无符号数减去一个比自身还要大的数,容易出现很严重的问题。原理大家都知道,内部是使用补码存的,但是写程序的时候不一定能注意到。

        使用一些底层的库函数时一定要确保传入的数据类型与接口要求的数据类型一致。我就发生过因为使用zlib的compress函数时要求传入unsigned char * 和 unsigned long int *时,我使用了char *和 unsigned int *时出现一些莫名其妙的错误。

       在使用没有接触的技术或者是底层的库函数的时候,一定要写够测试程序,充分的熟悉接口的使用,而不应该直接集成在软件中,否则会出现很严重的问题。

        使用系统调用或者库函数或者第三方软件的函数时,如果有返回值,一定要检查返回值的情况,以判断程序是否正确。可能就是这样一个小小的问题就会导致导弹打偏或者卫星脱轨,或者是火车站售票系统上常显示的”XXXX位置的内存不能为读“之类的致命错误。如果函数可能会抛出异常,一定要捕获异常。在调试阶段,出现这样问题时,一定要使用exit或者abort之类的方法,强制程序在此结束,并打出当前的行号、文件名称,如果有必要的话还有堆栈信息等这些重要的调试信息。这些对于确定程序出错的位置非常有帮助。   

       养成读文档的好习惯,出现问题的很多一部分原因都是没有仔细阅读文档。文档中详细的说明了接口的使用和注意事项,没有注意到这些细节,调试简直就是自作自受。

       还有常做单元测试,确保缩写的部分代码能够正常运行。然后再集成到软件中,否则出现问题的付出的代价要大的多。

本文出自 “相信并热爱着” 博客,请务必保留此出处http://hipercomer.blog.51cto.com/4415661/861856

[C/C++循环嵌套 cpp] 如何避免死循环?- 详解循环语句中的注意事项 尤其是循环嵌套语句,例如 for 和 while,它们的使用范围广泛,但在编写时往往容易出现死循环的问题。如果不及时解决,会导致程序无法正常退出或奔溃,因此在编写循环嵌套语句时需要特别注意一些重要事项。总之,在编写循环嵌套语句时,需要谨慎地考虑每一项细节,并避免出现死循环等问题。在这个循环中,i 的值会一直增加直到 int 类型的最大值,然后从最小值开始重新增加,导致程序陷入死循环。当 j 的值超过 int 数据类型的最大值时,该值将变为负数,从而导致程序出现不可预测的错误。- 详解循环语句中的注意事项。 阅读详情

相关推荐

C/C++ 基本类型的重要注意事项

在本文中,我们讨论了数据类型的大小、有符号和无符号类型、类型转换以及字节顺序等重要注意事项,并提供了相应的源代码示例。通过遵循这些注意事项,您将能够更好地利用基本类型,并编写出更加健壮、可靠的 C/C++ 代码。在 C/C++ 中,类型转换是一种将一个类型的值转换为另一个类型的操作。在某些系统中,数据的低字节存储在内存的低地址处,而高字节存储在高地址处(小端序);在本文中,我们将探讨一些与 C/C++ 基本类型相关的重要注意事项,并提供相应的源代码示例。在 C/C++ 中,不同的基本类型具有不同的大小。

HackLogic的博客 138

世界排名前8的自动化测试工具,你用过几个?

软件开发实践随着时间的推移而变化,工具和技术也是如此。这些变革的意义在于提高生产效率、质量、客户满意度,解决交付时间越来越短的问题,并交付成功的产品和服务。而软件测试显然在实现这个过程中起着重要的作用。 在测试自动化领域,自动化工具占据了很重要的位置。测试工具的作用是为了提高测试效率,用软件来代替一些人工输入,把软件的一些简单问题直观的显示在测试人员的面前,这样更方便测试人员找出软件的bug。 本文将给大家分享一些好用的自动化测试工具,可供参考。 1.Selenium Selenium可能是最流行的网络应用

卓码测评 717

C/C++之#define预处理器指令注意事项

1. #define(预处理器指令从#开始运行,到后面的第一个换行符为止)预处理表达式的长度必须是一个逻辑行,一个逻辑行可以是多个物理行。每行#define(逻辑行)都由三部分组成,具体如下图: 2. #define中,双引号使替换的字符串成为字符串常量。编译器把该字符串存储在以空字符结尾的数组中。 #define SINGLE_CHA 'a' //定义了字符常量 #define CHA...

Postgres 数据库内核开发工程师 1484

自动化测试⽤例注意事项

自动化测试⽤例注意事项如下: 1、在⼀个测试类⾥⾯,每⼀个测试⽅法都是以test开头的,test不能是中间或者尾部,必须是开头,建 议test_ 2、每⼀个测试⽤例⽅法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点 3、在⾃动化测试中,每个测试⽤例都必须得有断⾔,⽆断⾔的⾃动化测试⽤例是⽆效的 4、最好⼀个测试⽤例⽅法对应⼀个业务测试点,不要多个业务检查点写⼀个测试⽤例 5、如果涉及到业务逻辑的处理,最好把业务逻辑的处理⽅法放在断⾔前⾯,这样做的⽬的是不要因为业 务

wqchibingshaonian的博客 218

c++易混淆的知识点及注意事项

c++易混淆的知识点及C++考试易混淆知识点及注意事项 下列程序有何问题,请仔细体会使用指针时应避免出现这个的问题。 #include int main() { int *p; *pInt = 9; cout << "The value at p: " << *p; return 0; } 解: 指针 p 没有初始化,也就是没有指向某个确定的内存单元,它指向内存中的一个随机地址, 给这个随机地址赋值是非常危险的。 注意事项

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

写 c++ 需要注意什么

编写 C++ 代码时,需要综合考虑内存管理、代码效率、安全性、异常处理等方面。C++ 是一门非常强大的语言,但也需要开发者在编写代码时保持细心和耐心。遵循现代 C++ 编程范式、利用 STL 和智能指针、保持代码简洁和清晰,能帮助你写出更加健壮和高效的代码。

weixin_42101997的博客 1075

逆向分析PerimeterX px3:从混淆JS到生成有效令牌的完整实战

在Web安全与数据采集领域,反自动化防护是保障服务稳定和数据安全的关键技术。其核心原理是通过收集浏览器环境指纹和用户行为特征,动态生成加密令牌来区分真人用户与自动化脚本。这项技术的工程价值在于平衡安全性与用户体验,广泛应用于电商、金融、社交等需要防止恶意爬虫和自动化攻击的场景。本文聚焦于业界广泛部署的PerimeterX px3防护方案,通过JavaScript逆向工程,深入剖析其令牌生成机制。我们将探讨如何运用动态调试、反混淆工具和算法还原等关键技术,突破px3的防护壁垒,为自动化测试和数据采集提供稳定可

diankui6178的博客 526

C++类的注意事项

清晰性:通过规范命名、访问权限和函数设计提高代码可读性。安全性:通过explicitprivate等限制避免误用。性能与可维护性:通过短小函数、组合优先等优化设计。如果有具体问题或需要进一步示例,请告诉我!

cxyhjl的博客 1061

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

Ceres-solver examples之pose_graph_3d学习笔记

Ceres-solver examples之pose_graph_3d学习笔记简要说明变量说明关键步骤一、Costfunction的搭建其中包括:二、构造Problem 简要说明 ceres-solver库是google的非线性优化库,可以对slam问题,机器人位姿进行优化,使其建图的效果得到改善。pose_graph_3d是官方给出的二维平面上机器人位姿优化问题,需要读取一个g2o文件,运行程序...

幽冥小龙的博客 3890

C/C++编程注意事项

1. 防止头文件的重复包含 #ifndef __TEST_H__ #define __TEST_H__ class Test { public: Test(); }; #endif // __TEST_H__ 否则会显示, 常见的error: redefinition of ‘class Test’ error: previous definition...

OpticalSoliton的专栏 958

在Pycharm中配置Pyqt5工具(2023年新版教程)

在Pycharm中配置Pyqt5相关的三个工具:QtDesigner、PyUIC、PYRCC

网络技术和Python 2万+

64位平台C/C++开发注意事项

64位平台C/C++开发注意事项

qq_35836473的博客 446

SQL-拼多多 面试题:连续3次为球队得分的球员名单

1.使用LAG开窗函数 筛选出 下一次和下下一次得分,并用进球时间进行排序。2.使用where筛选出值得嘉奖的球员。

Ftr1998的博客 643

YOLO26改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 什么!不知道如何改进模型⁉️ 本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行,性价比极高。2️⃣ 找不到合适的模块⁉️ 所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,并进行二次创新,新颖度高,创新度高,能够适应不同的任务场景。3️⃣ 不确定自己改进的步骤、结果是否正确⁉️ 订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容,非常适合新手

Limiiiing的博客 6356

C/C++ #include 指令注意事项

指令是一个预处理器指令,用于在编译时将指定的文件内容包含到源文件中。这样可以确保头文件只被包含一次,避免重复定义和编译错误。指令在项目中的正确使用,从而提高代码的质量和可维护性。通过遵循这些注意事项,可以确保。在 C/C++ 中,

fenggang2021的博客 689

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

C/C++ 字面常量的注意事项

在 C/C++ 中使用字面常量时,有几个重要的注意事项需要考虑,以确保代码的准确性和可移植性。下面是一些关键要点:整数字面量:默认情况下,整数字面量是int类型。如果字面量的值超出了int的范围,它将被视为long int或long long int,这取决于它的值和编译器。可以在整数字面量后添加L或l后缀来明确指定它为l...

weixin_28717611的博客 186

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C/C++ new和delete使用注意事项

文章目录 new和delete,是C++进行动态内训分配时,常用的工具之一,他们必须成对使用。C++很多难以察觉和解决的错误都和内存分配相关。本文主要介绍new和delete的使用注意事项,同时了解相关的内存分配方式(比如malloc和free等)。 ...

qq_40250056的博客 2195

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

详解 C/C++ 全局对象注意事项

这意味着如果一个全局对象的析构依赖于另一个全局对象的状态,那么需要特别注意析构函数的执行顺序,以避免出现依赖的对象已经被析构而导致的问题。因此,必须确保全局对象的构造函数不依赖于任何在构造函数执行时尚未初始化的其他全局对象或静态变量。:虽然全局对象可以在整个程序中方便地访问和共享数据,但过度使用全局对象可能导致代码的可读性和可维护性下降。因此,应谨慎使用全局对象,并尽量将其使用范围限制在必要的范围内。:全局对象具有静态存储期,这意味着它们在程序的整个运行过程中都存在,而不是在创建它们的函数返回时就被销毁。

fenggang2021的博客 481

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C/C++宏定义注意事项

C/C++宏定义注意事项

wuleixxh的专栏 962

C/C++中的一些注意事项

文章目录1.结构体赋值相当于内存复制2.枚举的使用技巧3.C和C++中的头文件4.同名局部变量和全局变量的区别5.形参带默认参数的函数注意事项6.inline函数注意事项7.extern的省略问题8.C++和C源码互相调用的问题9.函数参数压栈时机10、访问权限的确认时机 1.结构体赋值相当于内存复制 struct stu{ int age; string name; }; struct stu s1,s2; s1.age = 10; s1.name = "Jack"; //赋值相当于内存复制 s2

weixin_39861267的博客 813
上一篇: dd命令
下一篇: 简单的map性能评测
下木
博客等级 码龄16年 88粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值