c/c++
文章平均质量分 95
侵蚀昨天
https://mp.weixin.qq.com/s/2f8b5pAwEZ6lnpiITZhakQ
展开
-
va_start和va_end详解
1. 在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表。例如:void foo(...);void foo(parm_list,...);2. 函数参数的传递原理 函数参数是以栈的形式存取,从右至左入栈。 参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int ...转载 2018-06-27 17:33:39 · 22539 阅读 · 11 评论 -
c/c++ restrict修饰符介绍
目前正在candence上学习优化算法,知道了一个关键字,总结一番以作记忆。 restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码....原创 2019-08-30 14:12:42 · 2032 阅读 · 1 评论 -
【C++】寻找目录中的文件并提取关键字
背景:目前debug过程中需要导入很多素材,如果代码中直接写死比较麻烦且耗时,所以比较好的办法就是材料放在某目录中,由程序自动检索所有符合后缀的文件,然后进行操作。void Find(const char* lpPath, std::vector<const std::string> &fileList){ char szFind[MAX_PATH]; W...原创 2019-08-29 16:07:23 · 1245 阅读 · 0 评论 -
可重入函数
何谓可重入? 在实时系统的设计中,经常会出现多个任务调用同一个函数的情况,例如我们经常使用的线程经常要关心它是否为线程安全的函数。如果它不是一个可重入函数的话,如果多方调用,可能会更改其他调用这个函数的值,从而导致不可预料的后果。而可重入函数可以同时被一个以上的函数调用而不会担心数据被破坏。满足下列情况的是不可重入:1、使用了全局变量或者静态局部变量;2、部分系...原创 2019-04-25 15:55:07 · 183 阅读 · 0 评论 -
gcc编译选项总结
常用编译选项#--------------------------------------------------------------------------------[介绍]gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生...转载 2019-04-10 13:33:42 · 1076 阅读 · 0 评论 -
C语言:浅拷贝与深拷贝
浅拷贝:表层的引用,实际指向同一块内存深拷贝:存放在不同的内存空间当中typedef struct{ char name[20]; int age;}student;student stu1;student stu2;stu1.name="kkk";stu1.age=20;stu2=stu1;printf("stu1addr=%p...原创 2019-03-07 15:40:24 · 2229 阅读 · 0 评论 -
linux c奇淫技巧v1
数组相关零长数组:struct b{ int a; int b[0]; //不占空间}/*1、动态分配可变长度的数组2、方便释放,原地及数据3、提高访问速度*/为什么不用指针代替零长数组?struct buffer1{ int len; int a[0];};struct buffer2{ int len; ...原创 2019-01-27 22:45:26 · 397 阅读 · 0 评论 -
C语言宏定义中经常使用的UL含义
1、U表示 unsigned 无符号,L表示 long 长整数。后缀大小写都可以,可以单独使用(100U),也可以组合使用(100UL)。2、F表示float,但是F不可以和U组合,因为浮点数没有unsigned。3、后缀的作用是指明数据类型。因为单独写300000程序默认的类型是 int,加上后缀UL后成了unsigned long。同样的1.5这样浮点数,默认类型是double(双精度...转载 2018-12-12 19:07:04 · 16159 阅读 · 0 评论 -
fork和vfork解析
linux操作系统中,这两个函数都是用来创建子进程# include <unistd.h>pid_t fork(void);pid_t vfork(void);成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。失败:返回 -1。 fork和vfork的区别fork特点:fork创建子进程的时候是完全拷贝一份父进程的资源,子进程...转载 2018-10-24 14:10:04 · 595 阅读 · 0 评论 -
__attribute__用法解析
attribute是GNU C特色之一,在linux开发中用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.函数属性(Function Attribute)noreturn noinline always_inline p...转载 2018-10-13 11:54:33 · 2137 阅读 · 0 评论 -
__attribute__((weak)) 简介及作用
最新在看项目新架构代码上看到了有使用到weak,以前没有看到过,所以写一篇文章以作记录。场景:A,B两个模块,A模块调用了不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。 弱符号:若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak属性,则这些全局符号不会引...原创 2018-10-13 11:49:25 · 21448 阅读 · 2 评论 -
C语言结构体中冒号(位域)用法
位域出现的原因是由于某些信息的存储表示只需要几个bit位就可以表示而不需要一个完整的字节,同时也是为了节省存储空间和方便处理。 typedef struct bit_struct{ int bit1:3; int bit2:5; int bit3:7;}data; bit1、bit2、bit3表示对应的位域整个位域结构体占用2个...转载 2018-08-07 11:51:53 · 7479 阅读 · 1 评论 -
#、##、__VA_ARGS__和##__VA_ARGS__的作用
一、#用来把参数转换成字符串例子一:#define P(A) printf("%s:%d\n",#A,A); int main(int argc, char **argv){int a = 1, b = 2;P(a);P(b);P(a+b);system("pause");...原创 2018-07-06 00:12:54 · 91707 阅读 · 13 评论 -
C++11 make_shared以及shared_ptr
make_shared的使用:shared_ptr<string> p1 = make_shared<string>(10, '9'); shared_ptr<string> p2 = make_shared<string>("hello"); shared_ptr<string> p3 = make_shared...转载 2019-09-05 16:13:17 · 12059 阅读 · 2 评论