随笔分类 - C / C++
C && C++
摘要:函数指针是指向函数的指针变量。在 C 语言中,函数名实际上是指向函数代码的指针,因此可以将函数名赋值给指针变量,从而创建一个指向该函数的指针。通过函数指针,可以动态地在运行时选择要调用的函数,以及将函数作为参数传递给其他函数。 函数指针的使用注意函数指针的声明匹配,如下: #include <std
阅读全文
摘要:指针数组: int *p[2]; // p先与[]组合成为数组,所以这个玩意是个数组 数组指针: int (*p)[2]; // p先与*组合成为指针,所以这个玩意是个指针 符号优先级:() > [] > * 指针数组的demo: #include <stdio.h> int main() { //
阅读全文
摘要:字符串的常见函数: strlen() // 计算字符串的长度,即字符串中字符的个数(不包括字符串末尾的空字符'\0' strcpy() // 将一个字符串复制到另一个字符串中。目标字符串必须有足够的空间来容纳被复制的字符串。 strcat() // 将一个字符串追加到另一个字符串的末尾。目标字符串必
阅读全文
摘要:typeof 是 C 语言的一个扩展,用于获取表达式的类型。它的主要用途包括: 1、声明变量类型: 可以用 typeof 来声明变量,而无需显式指定变量的类型。这样可以使代码更加简洁和易读,特别是在处理复杂的表达式时。 2、简化类型名称: 在定义结构体、联合体等复杂类型时,使用 typeof 可以简
阅读全文
摘要:柔性数组(Flexible Array Member)是 C 语言中的一种特性,允许在结构体的末尾定义一个数组,但是这个数组的大小可以在运行时确定。柔性数组通常用于动态分配内存,特别是在需要保存可变数量元素的情况下非常有用。一般来说,柔性数组的定义方式如下所示: struct flex_array
阅读全文
摘要:1、线程与进程 进程:一个正在执行的程序,是资源分配的最小单位 1)进程中的事情需要按照一定的顺序逐个执行,那么如何让一个进程中的一些事情同时执行? 2)进程出现了很多弊端:一是由于进程是资源拥有者,创建、撤销与切换存在较大的时空开销,因此需要引入轻量级进程;二是由于多处理器(SMP)出现,可以满足
阅读全文
摘要:参考博客:http://blog.chinaunix.net/uid-20548989-id-1667467.html 中断处理函数,需要把一个值存在 void * 中传给回调函数,然后在回调函数内部把 int 值从 void * 中取出。 把一个 int 存到 void * 变量需要先把它转换成
阅读全文
摘要:在linux下,printf输出到控制台经历了app->libc(stdio.h)->syscall->console驱动 下面是<<linux内核完全注释>>一书中的一段描述: 继续看下write函数的实现: 以下是write()函数的基本定义: #include <unistd.h> ssize
阅读全文
摘要:共用体 共用体(Union)是一种特殊的数据类型,它允许在同一个内存位置存储不同的数据类型。 共用体的所有成员共享同一块内存空间,因此同一时间只能存储其中一个成员的值。 共用体的定义和结构体类似,使用关键字union,后面跟着成员列表。每个成员可以是不同的数据类型,但共用体的所有成员都共享同一块内存
阅读全文
摘要:位运算在linux内核或裸驱中使用十分常见,下面是两种使用方式在此记录: 对寄存器进行操作: 举个例子, 1、清除bit8-bit10,并将bit8-bit10设置为0x2 reg = (reg & (~(0x7 << 8)) | (0x2 << 8)); 2、将bit4置一和置零 reg = (r
阅读全文
摘要:简单日志系统设计 在高通或者MTK的源码中,以camera系统为例,多个子模块,我们可以通过向debug系统中通过打开关闭相关模块对应的bit位来开启或关闭模块日志 在内核中实现其实并不复杂,使用module_param来创建一个sys节点来进行日志控制: 如下: static int debug
阅读全文
摘要:c语言代码中,存在大量的宏定义语句,宏定义本质是在预编译时的简单替换 注意到下面的代码宏定义如下: #define cam_debug(fmt, ...) \ do {\ if (debug & BIT(2)) { \ printk("CAM_DEBUG " fmt, __FILE__, __fun
阅读全文
摘要:C 语言中的回调函数是一种函数指针,可以将其作为参数传递给另一个函数,在该函数中调用回调函数来完成特定的任务 具体来说,回调函数通常用于异步编程或事件驱动编程,以处理异步任务完成后的回调 简单使用demo: #include <stdio.h> // 回调函数类型定义 typedef void (*
阅读全文
摘要:__weak关键字 __weak是一个c/c++编译器关键字,用于定义一个弱化符号。弱化符号是一种在链接阶段可以被覆盖的符号,允许多个同名符号存在于不同的目标文件中,而不会产生冲突。 当一个符号被声明为__weak时,它具有两个特性: 1、如果该符号在某个目标文件中被定义,那么这个定义将成为默认实现
阅读全文
摘要:extern关键字 extern关键字有两种用法: 1、用于声明一个全局变量或函数的外部链接性 2、extern "C" 是一个语言特性,用于告诉编译器按照 C 语言的方式对待指定的代码块,以确保与 C 语言兼容 用法一:用于声明一个全局变量或函数的外部链接性 // file1.c #include
阅读全文
摘要:设计库的目的1)程序更加简洁,不需要维护太多的源文件 2)保护三方厂商的知识产权 gcc常用指令复习一波gcc的常用指令: -E :仅执行预处理(不要编译、汇编或链接)。 -S :只编译(不汇编或链接)。 -c :编译和汇编,但不链接。 -o <file> :指定输出文件。 -pie :创建一个动态
阅读全文
摘要:提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof && container_of offsetof宏 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 宏解析: 1、size_t在系统中一般
阅读全文
摘要:c/c++中的一个常见,驱动调试中相当常用的一个关键字 总结一下volatile关键字的作用: 1、多线程中防止编译器优化 #include <stdio.h> #include <stdlib.h> #include <pthread.h> volatile int flag = 0; // 定义
阅读全文
摘要:c语言命令行,常用到getopt_long和getopt两个函数,在此做个记录 getopt() getopt函数是一个用于解析命令行参数的C标准库函数,通常与头文件一起使用 int getopt(int argc, char * const argv[], const char *optstrin
阅读全文
浙公网安备 33010602011771号