C/C++知识扩充
文章平均质量分 60
北冥的备忘录
这个作者很懒,什么都没留下…
展开
-
【微记录】Makefile中wildcard(通配)的一种用法--如何避免某个头文件路径不存在造成CLFAGS添加后编译报错?
在Makefile中使用wildcard将路径剥离后查看是否为空,原创 2024-05-15 02:45:17 · 518 阅读 · 0 评论 -
【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?
(也可以直接在vscode中配置,忽略)主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录。原创 2024-04-14 10:22:58 · 1045 阅读 · 0 评论 -
kunit常用的20个判断宏(2真假、6大小、5指针、2字符串、2内存、2断言、2msg)
另外根据这个这些接口看Linux内核代码在5.x之后kunit修改挺多的。原创 2024-04-12 00:14:17 · 224 阅读 · 0 评论 -
Linux内核单元测试框架kunit的3个对象和N个函数和1个接口(kunit_suite, kunit_case[], func1(), struct kunit,kunit_run_tests)
这个kunit相当于是一个中间态的结构体,kunit内部每次执行前定义一个临时的kunit,然后进行执行。每次执行后,把结果更新到这个kunit中,并且使用的kunit的判断宏使用这个kunit里面的status根据判断结果存储进去。比如KUNIT_EXPECT_EQ(test, 1, 1),就会把OK的结果存入test的status中。这里相当于使用了结构化初始化,把所有需要运行的case,放到my_test_cases的数组中。然后执行完成后,把执行结果test存储到case的status中。原创 2024-04-11 23:39:52 · 817 阅读 · 0 评论 -
常用的一些GCC参数的记录(不管更新)
经常需要配置各式各样的C语言的GCC参数,也老是忘记。特此归档记录在这里,以供未来取用。暂时只收集想到的用过的 更多以后更新和迭代。后文将以makefile中更新某个CLFAGS的方式记录。原创 2024-04-10 00:45:36 · 116 阅读 · 0 评论 -
C语言奇技淫巧之--用宏定义替换函数名的另外一种思路
比如内核有个kunit模块,然后我们自己实现了一个kunit接口类似的模块,如果内核加载了这个模块,自己的模块就需要都把函数替换一遍,优雅地做法就是上面的方式。上面的代码有点绕,要动态的来看,在编译预处理阶段将myfunc函数替换为_myfunc,那么通过-i参数假设看生成的预处理后的文件就会看到只有_myfunc,没有myfunc了。奇技淫巧的做法是,灵活利用C语言编译预处理,在预处理阶段就进行了替换,从而避免了某个函数各种名字的方式,不过这种类型仅限于微改变函数参数仅仅改变函数名字的场景。原创 2024-04-10 00:23:38 · 996 阅读 · 1 评论 -
再谈Makefile和C的2种变量和3个空间和2种if的工程实践中的常见用法的模板
提笔简要记录方法。原创 2024-04-09 23:50:25 · 328 阅读 · 1 评论 -
C语言奇技淫巧之--“函数指针数组”的类型定义与结构化初始化某一个函数
错(这种定义方式可以定义非函数类型)# 对(函数类型的类型名直接就是在(*)里面enum {//注意一般是使用多个func,比如linux内核,但是很少用函数指针数组,尤其是还包括结构化初始化。原创 2024-04-09 23:33:33 · 427 阅读 · 0 评论 -
Makefile命令行指定参数传递到C语言文件的4个步骤、2类关键字和2种变量
使用在 命令参数,比如 echo 参数,GCC 参数使用在定义条件分支,比如 ifeq linux 或者 mac使用在定义 relase 或者 debug 发布使用在定义 C 语言cflags有某个功能宏定义开关,C语言根据场景判断是否有这种功能代码进行预编译区分(优势是能够节省代码段)核心:make ifeq 与 else ifeqc ifdef 与 else ifdef。并且ifdef = if defined。原创 2024-03-28 08:42:58 · 1398 阅读 · 0 评论 -
GDB 快速使用调试测试 C 程序的3个步骤
所以核心是 gdb直接启动后,r执行程序 crash后使用bt查看程序所在行。更多高阶用法以后更新。原创 2024-03-16 00:40:50 · 743 阅读 · 0 评论 -
一个 C 语言中使用 # 的工程实践,直接将文本字符转义成C语言字符
在工程初期,某个回调函数还没有被实现,但是希望在能够打印出来。原创 2024-03-16 00:26:53 · 384 阅读 · 0 评论 -
【微知识】Makefile 如何执行 shell 代码?$(shell xxx)
然后就可以用类似的 其他文档中提到的将src进行编译的方式进行编译。原创 2024-03-15 23:43:15 · 317 阅读 · 0 评论 -
Makefile中使用 CFLAGS 与 SRC 的组织编译文件的2种工程实践和3个Makefile自动变量
在工程实践中总是会把教科书上的灵活运用,比如拆分到多个文件还是有一定的工程效能的。值得体会体会。原创 2024-03-15 23:38:03 · 1003 阅读 · 0 评论 -
如何把复杂的Makefile按照子模块拆分到不同的Makefile文件中的2个步骤?以及为什么要独立到不同子目录?
对于大型的工程项目,需要多个 Makefile。或者把某个复杂的 Makefile 拆解到不同的 Make 文件中。如何将一个复杂的 Makefile 拆解到不同的文件达到类似 C 语言的 #include “xxx.c” 这种效果?注意,这里有一个工程实践,就是把每个子模块都在当前目录下创建了子目录,并且每个子目录添加了自己的cfg.mk。另外再子目录的cfg.mk的相对路径需要使用和主目录相同的相对关系。对于需要把某个模块拆分成多个子模块,此时该方法就能很好的做到单一职责原则以及开闭原则。原创 2024-03-15 23:14:24 · 287 阅读 · 0 评论 -
C语言如何使用宏定义封装printf等函数并且接收可变参数?编译预处理符号##的两种用途
如何自定义日志?可以通过宏定义 也可以定义独立函数。独立函数会带来一些性能损耗。所以最好用宏定义方式。使用宏定义方式存在一个问题,就是比如printf很多时候的参数是可变的,那么如何使用宏定义支持将可变的参数能够支持下面是模仿linux kernel的多级别log的方式76544321doif<=printf;while0MY_PRINT不会打印DBG,因为级别不够.原创 2024-01-29 23:34:37 · 763 阅读 · 0 评论 -
C语言如何根据Makefile配置宏定义值进行编译预处理 #if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
C语言如何根据Makefile配置宏定义值进行编译预处理 #if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)原创 2024-01-26 08:52:19 · 397 阅读 · 0 评论 -
手撕烂笔头-内核中一些不错的宏定义代码工具之WARN_ON_ONCE-解决异常刷屏问题
定义一个static 然后执行warn_on。原创 2023-08-12 14:23:42 · 1202 阅读 · 0 评论 -
手撕烂笔头-为什么C语言编译后除了.data段还需要.bss段?
BSS是英文Block Started by Symbol本质是一个Block(块),是一个Symbol block,存了很多symbol。我们知道数据存储最出名的就是.data和.bss这两个segment(段)。看起来这两个都是存储全局变量和静态初始化变量的,为什么还需要两个段?主要是为了节省存储空间。原创 2023-08-06 22:20:56 · 165 阅读 · 0 评论 -
C/C++知识扩充_C++头文件一览
C++头文件一览 C #include //设定插入点 #include //字符处理 #include //定义错误码 #include //浮点数处理 #include //对应各种运算符的宏 #include //定义各种数据类型最值的常量 #include //定义本地化C函数 #include //定义数原创 2013-09-18 21:11:31 · 2167 阅读 · 0 评论 -
C/C++知识扩充_cctype和climits的用法
cctype和climits的用法 一、 cctype中通常包括一些常用函数的判断,如某个字符是否为大写,用isupper()如果参数是大写字母,函数返回true, 还有像isalnum(),如果参数是字母数字,即字母或者数字,函数返回true.下面我们通过一个小示例来查看输出结果:cout 输出:i is : 0如果把参数改为'B',则会输出:i is : 1 其它函数的用法见下列原创 2013-09-18 21:11:29 · 7403 阅读 · 0 评论