
C++/C
文章平均质量分 77
HMJ_
生命不止,学习不息。
展开
-
printf使用占位符控制输出格式
printf()函数提供丰富的占位符参数以便精细地控制输出格式,再进行字符操作的时候我们可能会使用到sprintf类函数进行处理,因此这里对printf()函数的格式化输出控制进行较为“详细”讨论。转载 2022-10-17 15:02:08 · 4192 阅读 · 0 评论 -
inline关键字的用法
inline函数修饰符的作用和用法;翻译 2022-08-31 15:32:13 · 146 阅读 · 0 评论 -
Gcc编译优化等级介绍
O0选项不进行任何优化,在这种情况下,编译器尽量的缩短编译消耗(时间,空间),此时,debug会产出和程序预期的结果。当程序运行被断点打断,此时程序内的各种声明是独立的,我们可以任意的给变量赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中 精确地获取你期待的结果.O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。转载 2022-08-22 12:37:04 · 2506 阅读 · 0 评论 -
操作系统中C程序内存分布
memory management is one of the most important topics for a Programmer, and so understanding the Memory Layout of a C Program and Memory Layout of a Process becomes essential.For high-level languages such as Java, Python, C#, Memory is partially managed by转载 2022-06-14 12:11:52 · 144 阅读 · 0 评论 -
十进制小数转二进制小数
一、二进制数转换成十进制数由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。例1105 把二进制数110.11转换成十进制数。 二、十进制数转换为二进制数十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。十进制整数转换为二进制整数十进制整数转换为二进制整数采用 “除2取余,逆序排列” 法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用转载 2021-09-01 12:35:14 · 776 阅读 · 0 评论 -
gdb调试工具
前言使用C编程, 虽然大部分问题采用简单粗暴的printf方式都能得到解决, 但是也有一些问题不好定位, 例如程序崩溃, 导致出错点附近的打印都会消失, 而且因为是多线程编程, 排查问题更为困难, 如果采用传统的printf大法难免事倍功半. 而此时最好的办法还是使用gdb帮助我们确定问题出现的地方, 程序崩溃时的内存状况.1.1. 启动gdb对C/C++程序的调试,需要在编译前就加上-g选项, 主要是为了便于对照源码:g++ -g hello.cpp -o hello调试可执行文件:gdb转载 2021-08-12 19:38:31 · 183 阅读 · 0 评论 -
C中宏定义解析
定义常量宏在代码中用宏代替常量,使代码含义更明确:#define M_PI 3.14159265358979323846264338327950288定义函数宏最小值函数如果你想要定义一个取最小值函数,不想写一个函数,不想使用函数频繁的开销系统资源,想用更轻量级的函数宏来解决,一般你会写:#define MIN(A,B) ((A) < (B) ? (A) : (B))这种写法其实存在问题,应该是下面这种行,想一想上面的A如果是x++,结果是什么?下面这种写法可以避免这种原创 2020-05-08 18:58:34 · 364 阅读 · 0 评论 -
C使用宏定义封装printf实现日志功能
问题在日常的开发中,我们经常会在代码中加一些信息便于调试和反查bug,加的这些打印对我们来说是很有帮助的,并且我们在代码发布的时候并不想删除他们,但又不想他们继续打印这些信息;思路如果需要可控的输处日志信息,最好的是我们程序有个日志系统(不是写入内核的环形缓冲区How can I write to dmesg from command line),但嵌入式设备应用一般是轻量级应用,不好带臃肿的日志库,所以最好我们能封装printf;使用宏定义开关 #ifdef __DEBUG #define x原创 2020-07-16 17:07:26 · 12055 阅读 · 8 评论 -
C语言生成指定长度随机字符串
问题今天发现一个以前写的生成指定长度的随机字符串的函数,在连续调用时会返回相同的字符串,发现是以time(NULL)作为随机种子,于是做了下改进。办法将种子改为当前秒数和微秒的和,这样就可以保证连续请求(us等级)多次不会导致生成相同的字符序列。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/time.h>int get_random_str(char原创 2020-10-30 17:01:16 · 4034 阅读 · 0 评论 -
C语言0数组柔性数组使用介绍
0数组和柔性数组的介绍0数组顾名思义,就是数组长度定义为0,我们一般知道数组长度定义至少为1才会给它分配实际的空间,而定义了0的数组是没有任何空间,但是如果像上面的结构体一样在最后一个成员定义为零数组,虽然零数组没有分配的空间,但是它可以当作一个偏移量,因为数组名这个符号本身代表了一个不可修改的地址常量。柔性数组也叫可伸缩性数组,而0数组是一种柔性数组。因为在早期没引入0长度数组的时候, 大家是通过定长数组和指针的方式来解决的, 但是定长数组定义了一个足够大的缓冲区, 这样使用方便, 但是每次都造成空间转载 2021-05-11 13:18:53 · 238 阅读 · 0 评论 -
BCD码与十六进制值转换
BCD码中最常用的就是8421型BCD码数值, 仪器为例使用以下方法进行转换:宏函数// BCD 码 转 十进制#define BCD_TO_DECIMAL(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))// 十进制 转 BCD 码#define DECIMAL_TO_BCD(x) ((((x) / 10) << 4) + ((x) % 10))函数/** * \brief 十六进制转bcd 用于把时原创 2021-03-01 11:15:10 · 9204 阅读 · 0 评论 -
c/cpp代码命名风格(谷歌开源项目风格指南摘录)
7.1. 通用命名规则总述函数命名, 变量命名, 文件命名要有描述性; 少用缩写.说明尽可能使用描述性的命名, 别心疼空间, 毕竟相比之下让代码易于新读者理解更重要. 不要用只有项目开发者能理解的缩写, 也不要通过砍掉几个字母来缩写单词.int price_count_reader; // 无缩写int num_errors; // "num" 是一个常见的写法int num_dns_connections; // 人人都知道 "DNS" 是什么i转载 2020-09-06 18:29:42 · 247 阅读 · 0 评论 -
变长参数 函数初探
前言变长参数,指的是函数参数数量可变,或者说函数接受参数的数量可以不固定。实际上,我们最开始学C语言的时候,就用到了这样的函数:printf,它接受任意数量的参数,向终端格式化输出字符串。本文就来探究一下,变长参数函数的实现机制是怎样的,以及我们自己如何实现一个变长参数函数。在此之前,我们先来了解一下参数入栈顺序是怎样的。函数参数入栈顺序我们可能知道,参数入栈顺序是从右至左,是不是这样的呢?我们可以通过一个小程序验证一下。小程序做的事情很简单,main函数调用了传入8个参数的test函数,test函转载 2020-08-13 19:20:20 · 275 阅读 · 0 评论 -
C代码风格(规范)
前言团队开发的时候,为了便于交流一个团队内有个通用的代码风格,能提高组员之间的交流效率,便于互相帮助。而制定一套C代码风格牵涉的细节较多,但是大多数规范要求相差并不大。因此可以参考别的公司的代码风格规范,制定一套关于自己团队的文档,文档尽量考虑目前团队的代码风格做出修改即可,尽量与之前的代码风格保持一致。代码格式规范化的七大原则代码格式规范化基本上有七大原则,体现在空行、空格、成对书写、缩进、对齐、代码行、注释七方面的书写规范上,遵循这些规则可以使代码更整洁美观,但这只是基础的要求,具体要求请参照 参原创 2020-08-04 17:02:51 · 1474 阅读 · 0 评论 -
C或者shell控制输出字符颜色
问题在编程的时候有时候需要强调显示一些信息,加粗字体或者改变输出字符颜色,来达到目的。办法LinuxASCII码本身就包含部分控制字符(33个,[0-31,127] (十进制))12二进制十进制十六进制缩写Unicode表示法脱出字符表示法名称/意义0000 000000NUL␀^@空字符(Null)0000 000111SOH␁^A标题开始 (start of heading)0000 001022STX␂^B本文开始原创 2020-07-16 16:20:28 · 385 阅读 · 0 评论 -
char转int的一个问题
问题描述这几天收到一个bug,一个角度数据α\alphaα, 在传输中用两个字节存放α∗100\alpha*100α∗100的整型数据,字节按大端序存储;就在这个角度的非负值数据转换中,我得到了一个负值的结果,导致设备不能正常工作。原因及解决办法一般非负值情况下出下了赋值,要嘛是越界,要嘛是程序没赋初值。核查了下自己的代码,发现自己在代码中用了char类型,而最大角度α\alphaα为360°360\degree360°, 则要表示的最大值为36000,而两个char类型表示超过327.68°327原创 2020-06-15 10:50:00 · 673 阅读 · 0 评论 -
结构体数组使用指针当作函数参量
场景今天在代码实现的时候,某一个设备状态结构体对应的设备有多个,因此定义了一个结构体数组,当在函数中处理时发现有点尴尬的是忘记了该怎么定义结构体指针参量才能在函数中正确访问各成员。结论关于结构体数组指针的使用,参见C语言结构体数组指针以及函数;其实当成一般的整形数组处理就好,因为C把你的自定义的结构体类型当成了元类型,你的结构体指针p进行自增操作p++,和整形数组自增操作一样,指针位置会自动偏移你定义的结构体大小的长度。总之,将结构体数组指针看作和整形数组指针一样就好,唯一的区别就是一个是整形常数一原创 2020-05-20 15:42:06 · 947 阅读 · 0 评论 -
C和C++运算符优先级
C 运算符优先级下表列出 C 运算符的优先级和结合性。运算符从顶到底以降序列出。优先级 运算符 描述 结合性 1 ++-- 后缀自增与自减 从左到右 () 函数调用 [] 数组下标 . 结构体与联合体成员访问 -> 结构体与联合体成员通过指针访问 (type){list} 复合字面量(C99)...转载 2020-04-22 10:59:26 · 527 阅读 · 0 评论 -
C中跨行定义字符串常量
在C语言中有些信息不需要修改,并且我们想将其保存在程序内部,就经常要定义字符串常量来保存这些数据,方便使用的时候调用,但是如果字符串过长,为了便于阅读就需要换行。在C中直接换行定义字符串数据编译器会报错。因此常用以下两种方式常用来跨行定义常量字符串:换行行尾加上转义符\如下图,这种定义的好处就是代码中定义的是什么样子,实际输出就是什么样子;也就是说,转义符前面的空格和换行后新行的前置空格会原...原创 2020-04-21 16:18:50 · 2373 阅读 · 0 评论 -
Python各种进制的数相互转换
转十进制int上面函数,只需要将第一个参数填写转换数值,第二个参数描述函数是哪个进制的数即可。转二进制bin该函数为十进制转二进制函数。因此如果是十六进制或者八进制数需要先调用int函数转为十进制。转八进制oct该函数为十进制转八进制函数。因此如果是十六进制或者二进制数需要先调用int函数转为十进制。转16进制hex该函数为十进制转十六进制函数。因此如果是八进...原创 2019-11-04 15:11:43 · 903 阅读 · 0 评论 -
关于des加密的示例
c中常用的是openssl的crypto库中的方法:openssl中的测试代码:Linkstatic int test_des_cbc(void){ unsigned char cbc_in[40]; unsigned char cbc_out[40]; DES_cblock iv3; DES_key_schedule ks; const size_t...原创 2019-06-18 10:42:38 · 926 阅读 · 0 评论 -
Linux下判断网卡类型
通过shell来看:cat /sys/class/net/eth0/type1与附表比对,查看设备下的网卡可以通过筛选类型值来判断网卡类型(`ls /sys/class/net/)通过C函数来查看:#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdl...原创 2019-05-29 10:06:06 · 7012 阅读 · 0 评论 -
extern的作用
用#include可以包含其他头文件中变量、函数的声明,为什么还要 extern 关键字?如果我想引用一个全局变量或函数a,我只要直接在源文件中包含 #include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用 extern 呢?这个问题一直也是似是而非的困扰着我许久,经过实践和查找资料,有如下总结:一、头文件首先说下头文件,其实头文件对计...转载 2019-05-28 11:19:53 · 8647 阅读 · 9 评论 -
手工扩栈
扩栈的好处,提升代码的运算速度,原创 2014-08-18 23:37:07 · 1447 阅读 · 0 评论 -
C打开文件夹遍历文件
linux中c实现打开遍历目录,其中dir指向的结构是由内核来维护的,因此文件夹内文件的变动可看到,如下示例:在当前目录创建了cJSON文件夹并在其中创建了一个cJSON.o的文件,来验证dir的结构是否会更新。/************************************************************************* > File Name: ...原创 2019-06-18 15:12:43 · 2241 阅读 · 0 评论 -
Linux errno 列表
//文件 /usr/include/asm-generic/errno-base.h /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef _ASM_GENERIC_ERRNO_BASE_H#define _ASM_GENERIC_ERRNO_BASE_H#define EPERM 1 /* O...转载 2019-07-16 09:40:00 · 511 阅读 · 0 评论 -
用Doxygen生成C代码文档两点提示
我们生成Doxygen文档时,如果工程下面有隐藏文件夹和不想出现在文档中的文件可以使用Doxygen全局宏。忽略文件的Doxygen类似于/test文件夹EXCLUDE_PATTERNS = */test/*Doxygen默认生成的文档是基于C++的对象概念的文档,要想生成针对于C这种函数式编程语言的文档,需修改Doxygen文件中的全局宏OPTIMIZE_OUTPUT_FOR_C...原创 2019-08-13 20:13:09 · 333 阅读 · 0 评论 -
关于质数
质数,又称素数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数)。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数集合有时表示成粗体。在抽象代数的一个分支-环论中,素元素有特殊的含义,在这个含义下,任何素数的加法的逆转也是素数。换句话说,将整数Z的集合看成是一个环,-Z是一个素元素。但是在数学领域...原创 2014-08-01 15:08:10 · 977 阅读 · 0 评论 -
linux静态与动态库创建及使用实例
一、gcc基础语法基本语法结构:NAME gcc - GNU project C and C++ compilerSYNOPSIS gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-Wpedantic] [-I...原创 2019-10-10 13:30:35 · 1137 阅读 · 0 评论 -
c中的static变量
静态变量具有在在其作用域结束之后仍能保持其值得属性。因此如果新的作用范围内,未初始化则会保持原来的值。语法:static data_type var_name = var_value;静态变量有以下几种属性:程序运行时,静态整形变量一直存在于内存中。正常的自动变量会在定义它的函数销毁时销毁。#include<stdio.h> int fun() { static...翻译 2019-05-30 17:13:23 · 873 阅读 · 0 评论 -
memset函数清空越界问题
memset 的函数说明如下:NAME memset - fill memory with a constant byteSYNOPSIS #include <string.h> void *memset(void *s, int c, size_t n);DESCRIPTION The memset() functi...原创 2019-05-16 10:20:16 · 1756 阅读 · 0 评论 -
QT调用Interop.LabelManager2.dll(C#dll)的问题处理
需求: 公司产线需要打印设备条码,便于简化生产步骤,因此需要在生产测试程序中添加打印条码的功能,原工具是由QT写的,因此沿用QT去实现功能。领导给了个C#的库,让做引用实现功能,可以与原生产对接。先说结果,我最终采取了C++封装C#的DLL文件,在QT中调用封装好的C++的DLL解决的问题。问题的核心在于怎么在QT中引用C#,QT是C++的扩展语言,支持原生C++;但是C++一般为非托管式代码原创 2017-07-26 01:34:55 · 3818 阅读 · 0 评论 -
C++ 判断文件文件夹是否存在
判断文件是否存在ifstream用ifstream创建文件的输入流,如果文件不存在,则输入流创建失败。ifstream fin("hello.txt"); if(!fin){ //TODO }File用File来判断文件是否存在File *fh = fopen("hello.txt","r"); if(fh == NULL){原创 2017-08-17 10:44:42 · 28804 阅读 · 2 评论 -
段错误总结
Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。 来自:温柔的暴力背景 最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。转载 2017-06-17 14:33:22 · 884 阅读 · 0 评论 -
用蒙特卡洛方法求取PI值
#include #include #include int x[100001],y[100001];double xx[100001],yy[100001];int GenerateRand(){ int a,c,m,p,q; //scanf("%d%d%d",&p,&q,&m); //scanf("%d%d",&x[0],&y[0]);原创 2016-03-15 11:46:27 · 786 阅读 · 0 评论 -
Gauss-Seidel迭代法求方程组的解
注意c语言中,abs()为求整型的绝对值的函数。对于float型需用fabs(),代码被这个不起眼的错误坑了好久,最后得出结论不熟悉的系统函数一定要慎用,只有在确切知道该函数的顶以后才取使用它,否则自己写函数都比使用不明函数来的好。c语言版#include #include #include #include #include const int maxn=1001,maxl原创 2016-03-29 20:02:35 · 3578 阅读 · 0 评论 -
运算符重载_例子
#include #include #include #include using namespace std;class Complex { public: Complex(){real=0,imag=0;} Complex(double r,double i){real=r;imag=i;} Complex operator+(Complex &c2); voi原创 2014-10-01 12:00:07 · 476 阅读 · 0 评论 -
sqrt
比系统sqrt函数更快的函数,本质是牛顿迭代,其中一个shenqideshuz转载 2014-08-30 15:05:42 · 631 阅读 · 0 评论 -
C++ 中动态二维数组的申请
动态二维数组的申请,主要是nei原创 2014-08-29 18:16:29 · 662 阅读 · 0 评论 -
sublime text 文本编辑器
受够了,灰头土脸的IDE ,心里一直想找一款适合自己的编辑器,不久前转载 2014-08-16 15:46:21 · 735 阅读 · 0 评论