C语言
文章平均质量分 89
mcdx
这个作者很懒,什么都没留下…
展开
-
MISRA-C规定不许用柔性数组?那就自己实现一个吧
文章目录写在前面为什么不让使用柔性数组如何替代写在前面最近公司安排参与一个项目,设备运行环境是在低轨,对稳定性要求很高,之前没接触过相关的项目,便试图找一下有没有航空相关的嵌入式C语言编程规范,于是网上搜索了一番,发现并没有完全针对这方面的内容,但是在汽车行业有一个名叫MISRA-C的规范文档,目前航空产业也开始在使用了,我也就下载了相关的资料了解了一下,但本文的重点不是这份编码规范,而是针对编码规范中的一条。为什么不让使用柔性数组下面是MISRA-C 2012的规范文档给出的解释,大概意思就是说柔原创 2021-07-30 10:18:52 · 462 阅读 · 1 评论 -
linux内核的宏:container_of
文章目录源码GNU扩展语法实现原理再看源码如何使用在编写驱动程序时,经常会用到container_of宏,这个宏的作用很强大,它根据结构体中一个已知成员的名字及其地址推导出整个结构体的起始地址,正因为有了这个宏,内核中经典的数据结构代码才得以高效复用。下面来简单剖析一下这个宏。源码摘自linux-5.7.8版本源码,它们还有很多变种宏,但是原理是一样的,只不过可能更加安全而已。#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &am原创 2020-09-07 21:47:20 · 256 阅读 · 0 评论 -
C语言的柔性数组,可能你听过,但未实际用过
文章目录语法形式特性如何使用特性验证我在项目中的使用总结引用外网的一段内容(原文链接):Flexible Array Member(FAM) is a feature introduced in the C99 standard of the C programming language.For the structures in C programming language from C99 standard onwards, we can declare an array without a原创 2020-09-04 21:38:14 · 349 阅读 · 0 评论 -
如何使用C的volatile关键字
首先声明本文译自国外网站的一篇文章,原文链接如下:https://barrgroup.com/embedded-systems/how-to/c-volatile-keyword建议有条件的直接阅读英文原版。可能读了这篇文章后,你会有所怀疑,因为你平时可能遇到过下面出现的情况,但是你并没有添加volatile关键字,程序任然正常的运行,个人觉得可能有以下的原因:1.其实BUG出现了,但是难以复现,所以被你忽略了2.现在的优化器足够智能,即使打开了优化,也能避免这些BUG的出现原创 2020-06-08 19:33:31 · 955 阅读 · 0 评论 -
你知道C语言中““的类型吗?
先看下面这个宏定义,这是我在阅读cjson源码的时候发现的,作用很简单,就是统计一个字串的长度。原创 2020-05-01 12:49:49 · 250 阅读 · 0 评论 -
C语言在头文件定义全局变量的技巧
在刚开始学习C语言的时候,可能很多人都听过前辈说要少用goto,少用do{}while(),不要在头文件定义全局变量等,但实际上每个特性都有其合适的应用场合,只要正确的使用是不会有问题的,相反还可能给代码带来好处。原创 2020-05-01 12:48:42 · 11471 阅读 · 0 评论 -
C语言关键字union在数据传输中的妙用
C语言关键字union,通常称为联合体或者共用体,其特性就是所有成员拥有相同的起始地址;原创 2020-02-07 17:02:14 · 524 阅读 · 0 评论 -
关于scanf防止缓冲区溢出
在使用 scanf 时有时候会出现这样的情况,我们定义一个 buf 来接收输入的字串,当输入的字串长度小于 buf 大小时没有问题,但是当输入的字串长度大于 buf 大小时,则有可能会出现段错误,就是因为 buf 溢出了,下面是一种解决这个问题的方法。出现这个问题的原因就是因为系统的缓冲机制,这个在网上很多文章讲解,这里就不讲解了。#include <stdio.h>#incl...原创 2019-08-10 15:40:15 · 4029 阅读 · 0 评论 -
VS下C语言获取键盘按键的方法
#include <windows.h>#include <conio.h>#include <stdint.h>int main(void){ int32_t keyVal = 0; uint32_t dlyCnt = 0; for(;;) { //有键按下时为真,非阻塞 while(!_kbhi...原创 2019-04-26 22:18:52 · 960 阅读 · 0 评论 -
C语言造轮子
/*double 数转 uint64_t 四舍五入法*//** vs 中线程安全函数 sprintf->sprintf_s* strtok->strtok_s* gcc 中线程安全函数 strtok->strtok_r*/uint64_t doubletoull(double a){ char strBuf[32] = {0...原创 2018-12-28 22:10:53 · 1423 阅读 · 0 评论 -
C语言学习笔记之补基础(有符号和无符号数)
关于(-128,127)的问题,以前也看过相关内容,但是一直没有完全的理解,现在再回过头学习后又有了深入的理解,写此文章仅为加深记忆。正数和负数在计算机中的存储都是以二进制位的形式,但是对于正数来说直接存储即可,而负数则是以补码的形式存储的,负数在计算机中的存储最高位表示符号位(1:负数,0:正数),例:7:(这里以 2 字节为例子说明)原码:0000 0111-7:原码:10...原创 2018-12-13 22:25:41 · 727 阅读 · 0 评论 -
一组很特殊的宏定义
这段宏定义的原型是在SEGGER的jlink驱动目录下源代码里面发现的,觉得非常有意思。就拿上篇文章的互斥锁来说吧,在函数中是这样实现的。/*打开互斥标志*/aRingBuf[ch].readWriteMutexFlag = true;/*关闭互斥标志*/aRingBuf[ch].readWriteMutexFlag = false;但如果用这组特殊的宏来定义的话,是这样的。...原创 2018-11-20 23:54:46 · 292 阅读 · 0 评论 -
对环形缓冲区的升级
例:FIFO size = 6;一:待写入数据 <= FIFO size - tail <= free size 一次拷贝即可完成二:FIFO size - tail <= 待写入数据 <= free size 需要两次拷贝才能完成 第一次拷贝直到尾部 第二次从"头"拷贝存取数据有两种方式,一种通过f...原创 2018-11-20 23:44:07 · 321 阅读 · 0 评论