
C/C++
hello-linux
9年USB开发经验 + 6年网络及以太网驱动开发经验 + 2年PCIe驱动开发经验 + 5年romcode开发经验,专注网卡驱动、网络协议(TCP/IP)、USB驱动及应用开发。
展开
-
__weak 关键字的作用
加上了__weak 修饰符的函数,用户可以重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。原创 2023-05-24 20:23:34 · 286 阅读 · 0 评论 -
获取函数调用堆栈
int backtrace(void **buffer,int size)该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小。在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址。注意:某些编译器...原创 2020-02-05 11:35:53 · 1643 阅读 · 0 评论 -
C语言编译流程:预处理、编译、汇编、链接
流程: 预处理:展开头文件/宏替换/去掉注释/条件编译 (test.i main .i) 编译:检查语法,生成汇编 (test.s main .s) 汇编:汇编代码转换机器码 ...原创 2019-12-01 10:44:58 · 3389 阅读 · 1 评论 -
C语言高级编程:字符串赋值的几种方式
1. 总结1)下面两种方式的字符串赋值均正确char str1[] = "hello str1";char *str2= "hello str2";char *str3; str3 = "hello str3";2)char str1[] = "hello str1"; 是将字符串赋值给数组,字符串存在数组里(这里是栈),可以修改字符串内容...原创 2019-10-08 11:22:39 · 18462 阅读 · 0 评论 -
C语言高级编程:接续符‘\‘的用法
接续符(\)表示断行。1)编译器将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行2)接续单词(函数名、关键字、变量等)时,反斜杠之后不能有空格,反斜杠下一行之前也不能有空格。如果不是接续单词,如定义函数宏,反斜杠下一行之前可以有空格,但反斜杠之后最好也没有空格,否则编译会产生警告。3)接续符适合在宏定义代码块时使用(不可以不使用,否则编译会报错)测试平台:64位X8...原创 2019-10-08 11:18:00 · 7457 阅读 · 1 评论 -
C语言高级编程:const限定函数形参
1. 代码#include <stdio.h>void fun(const char *p){ *p = 'a';}void main(){ char arr[] = "123"; fun(arr);}2. 编译D:\baoli\Desktopλ gcc test.ctest.c: 在函数‘fun’中:te...原创 2019-10-08 11:13:18 · 1371 阅读 · 0 评论 -
C语言高级编程:i++ 或 ++i作为函数参数
测试机:Ubuntu14.04 x86_641. 代码:#include <stdio.h>void print(int a, int b, int c){ printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c);}void main(void){...原创 2019-10-08 11:08:18 · 4676 阅读 · 2 评论 -
C语言高级编程:char、signed char 和 unsigned char的使用区别
1. 区别与联系:1)在定义字符类型时一般使用char来定义2)char被当成有符号或是无符号视不同编译器决定,由于ASCII码范围从0-0x7F(127),所以char无论被当成有符号还是无符号类型均可3)在定义数值类型时使用 signed char 和 unsigned char,signed char表示-128—127,unsigned char表示0—2554)三者在内存...原创 2019-10-08 11:02:13 · 5786 阅读 · 0 评论 -
C语言高级编程:sizeof计算数组大小需要注意的问题
测试平台:64位X86Ubuntu1. 代码:#include <stdio.h>void main(void){ char a[20]; printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(&a) = %d\n",sizeof(&a)); printf(...原创 2019-10-08 10:57:41 · 1546 阅读 · 0 评论 -
linux C bool变量
Linuxbool变量:1)是小写bool而非大写BOOL2)值为true或者false,而非大写TRUE和FALSE,大写的需要自己采用宏来定义3)linuxC下需要包含头文件stdbool.h4)Linux下false = 0,true = 1,且一个bool型变量占用一个字节内存空间5)BOOL是微软VC++独有的,TRUE和FALSE在VC++中也有定义,但是标准C...原创 2019-08-03 16:54:16 · 4904 阅读 · 0 评论 -
负数在计算机怎样表示与存储
负数在计算机中以补码的形式存储。在计算机系统中,数值一律用补码来表示。正数的补码:就是其本身负数的补码:是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)[+1] = [00000001]原= [00000001]反= [00000001]补[-1] = [10000001]原= [11111110]反= [11111111]补...原创 2019-08-03 16:48:56 · 3227 阅读 · 0 评论 -
静态库的编译和链接
静态库调用在外部文件中定义的函数:即在静态库中声明并调用函数,但是在外部文件中实现该函数。在编译成静态库时,源文件中可以只提供函数声明,具体的实现交给调用该静态库的人去做。 假设有a.c和b.c,a.c中声明并调用了fun1(),但是在b.c中实现fun1()。a.c#include <stdio.h>extern void fun1(void);int a...原创 2018-12-01 16:58:52 · 2472 阅读 · 0 评论 -
visual c++ build tools的安装与使用
开发环境:win10 + Microsoft Visual C++ Build Tools 2015----------------------------------------------------------------- The Microsoft Visual C++ Build Tools installs only the command-line compile...原创 2018-09-02 11:44:23 · 310184 阅读 · 78 评论 -
cygwin下使用gcc编译c可执行程序
环境:win10 64 + cygwin--------------------------------------cygwin默认没有安装vim和gcc。1. 安装vim运行setup-x86_64.exe,进入应用包安装界面,搜索关键字vim,选择vim安装。2. 安装gcc 运行setup-x86_64.exe,进入应用包安装界面,搜索关键字gcc,选择安装下面三个包。3. 编译、测试3.1...原创 2018-03-27 21:27:57 · 15514 阅读 · 0 评论 -
C语言编程规范
为何需要进行规范编程?1、程序员花更多的时间在调试、维护和升级已有代码上,而不是编写新的代码;2、程序最重要的是正确性,其次是可维护性,最后才是效率;3、学习如何写优美的程序与学习如何正确地编写代码同样重要;4、一个运行正常但没有注释的程序如同一个等待爆炸的定时炸弹,因为早晚会有人修改或升级这个程序;5、好风格应该成为一种习惯。如果你在开始写代码原创 2017-03-22 14:43:41 · 840 阅读 · 0 评论 -
IAR 下C中嵌入汇编
最近在读《C专家编程》一书时,遇到了C中嵌入汇编的问题,刚好最近的做的项目也经常遇到这个问题,决定花时间整理一番,理清在IAR环境下的使用方法。C中嵌入汇编指令在不同的编译器下有不同的实现方式,在IAR中有两种方式。一、内嵌汇编例子1: ……//C语言 asm("NOP"); ……//C语言。例子2:void test(void){__asm(原创 2015-10-31 12:11:30 · 9428 阅读 · 1 评论