![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c/c++
总结了一些c/C++的错误,知识点
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
mzhan017
小张
展开
-
代码书写:chain的省略
如果是要书写出整个chain,可能就比较费事。如果使用简短的格式就比较方便。但是这里有一个tradeoff在里面,就是如果对这个不熟,可能要来回找这个rlimit/task_rlimit函数。不利于新手对代码的了解。举一个例子:下面这个commit就是使用了rlimit这个小函数来省略书写整个chain。整个chain的书写对比。其实这种方式还是比较受欢迎的方式,但是需要慢慢融入。原创 2024-07-05 04:02:12 · 25 阅读 · 0 评论 -
C++: version `GLIBCXX_3.4.29‘ not found
通过strace看编译的过程发现了原因:编译sockper使用到的so文件时下面这个路径下的,这个路径下的so是之前自己build gcc的时候安装上去的。解决方法是,将这个目录下的so文件删除,重新编译sockperf。这就想不明白了,在同一个机器怎么可能能编译不能运行呢?原创 2024-06-20 14:41:50 · 165 阅读 · 0 评论 -
[晕事]今天做了件晕事39 惯性一例
今天遇到了一例惯性问题。大家调用memset接口函数的时候,习惯性使用sizeof作为第二个参数,一般情况下,这样可以确保正确性。但是如果直接习惯性拿常数作为sizeof的输入,可能得不到期望的值。原创 2024-06-18 13:19:53 · 627 阅读 · 0 评论 -
[晕事]今天做了件晕事37 extern “C“ 被认为了是外部函数
这里的声明是要告诉编译器,这个_dump是C语言的符号,没有经过mangle过的。但是这个关键字可能让人混淆是外部函数。因为这个关键字可以声明外部函数。这也算是一词多用的一个普遍问题。关键的关键是上面的这种写法,可能会让人产生一种错觉,这个函数是外部函数!记得有一句古话:大意失荆州!这个晕事也算是一个好的例子。因为这两个的含义之前都知道,一时迷惑忘记关心,或者有一种错觉,导致错误产生!最近看到一个函数声明是。原创 2024-06-12 06:28:36 · 541 阅读 · 0 评论 -
openvswitch代码查看的时候的一个问题
最近查看openvswitch的代码,发现有个函数怎么都找不到:ovsrec_open_vswitch_set_bridges。如果不熟悉这个代码,还真是不好找。原来还以为是宏定义出来的代码,现在看是中间穿插了一个代码自动生成层。最后通过汇编发现它还调用ovsdb_idl_txn_write函数。原创 2024-06-07 10:36:45 · 321 阅读 · 0 评论 -
C: error: request for member ‘tv_nsec‘ in something not a structure or union
这种错误也是比较隐晦,因为错误不在本行。但是肯定可以确定就是在那一行的前后,但是要确定是上面的某一行少了逗号,还是要费些周章。原创 2024-05-28 08:31:52 · 474 阅读 · 0 评论 -
[晕事]今天做了件晕事33 c++ mangle 函数名
比如展示:_Z18printConfiguredIPsv undefined。而不是printConfiguredIP undefined。需要改一下连接器代码?作为一名c的程序员,开始使用c++的时候,如果工程里同时有c和c++,而且函数相互调用。这样看到mangle的字符串,倒是可以联想起来这个问题。这个时候,需要注意,原创 2024-05-15 11:25:27 · 207 阅读 · 0 评论 -
性能问题一例strcmp
其实如果一个字符串在运行的过程中一直保持不变,而且被重复的用来做strcmp操作,就不如先用字符串算出一个hash数值来,将其中的差异性用简单的数值比较先做一遍,如果哈希值相同的情况下,再做strcmp的比较,这样可以节省很多的effort,节省效率。最近做性能优化,发现代码里的一个循环里有使用strcmp做比较,这个函数其实比较耗cpu,原创 2024-05-07 20:19:35 · 180 阅读 · 0 评论 -
[错觉] 有了1和2,下一个应该是3?
这个例子是一个几年前的例子,说有个同事在原来代码的基础上新加一个标记位,这个标记位就是按照一个byte里的第几个bit是否标记位1来做逻辑判断。其实已有代码逻辑的实现有些绕,应该用另一个方法来实现左移操作。大家是否能值得用哪一种吗?原来的代码有如下的逻辑。如果想加 flag3。原创 2024-04-08 08:48:51 · 410 阅读 · 0 评论 -
C: 编译错误:syntax error before ‘&‘ token
这个是初学者的典型错误,在函数调用的时候呢,是不应该把类型 int放在前面的,只有定义/生命的时候才需要使用。就是将定义与调用形式没有理解清楚。如果放一个类型,int,编译器可能以为要定义一个函数原型。但是后续的输入,又不是函数定义,就会报错。原创 2024-03-30 14:38:58 · 360 阅读 · 0 评论 -
c/c++: warning变量未初始化的一个workaround:uninitialized_var
【代码】c/c++: warning变量未初始化的一个workaround:uninitialized_var。原创 2024-02-26 20:15:20 · 123 阅读 · 0 评论 -
C:宏:编程风格:井号与define之间的空格
应该是为了阅读代码的方便性,因为如果不加空格会对代码阅读造成一定的困难;但是为什么不直接将整个#define都缩进呢?应个人的阅读爱好,其实只要养成一种阅读习惯,就可以,不管是前加空格还是后加空格,只要可用表示出if缩进块的功能就好。在这一篇中有提到,井号与define之间空格,可能导致搜索上的一些问题。原创 2024-01-01 12:20:46 · 752 阅读 · 0 评论 -
Linux: dev: cmake: CHECK_LIBRARY_EXISTS
这个方法是在Modules/CheckLibraryExists.cmake文件里定义的一个宏。最终使用的方法是通过现场编译一个文件,里面调用所需要的函数,链接时,使用-labc链接库,然后确定这个库有没有在编译环境安装。原创 2023-12-24 21:11:53 · 1037 阅读 · 0 评论 -
[c++] 意识需要转变的一个例子,全局变量的构造函数先于main执行
最近还遇到一个例子是关于:从C转C++开发需要注意的一个意识问题。本人遇到的这个问题是,带着C的意识来看C++的代码,然后根据代码看,有一个全局变量的值在main函数进入之后才会更改,所以百思不得其解,这个变量怎么在main函数之前发生了改变?这里的一个区别是,C++里全局变量的构造函数是先于main函数执行。根据gcc文档里这个属性的作用:那究竟是怎么实现的呢?这个可用通过查看一个qemu的调用栈,来看其中的流程:(gdb) bt?()原创 2023-12-14 21:31:59 · 913 阅读 · 0 评论 -
Linux: 文档 :相关接口文档手册还是需要仔细阅读
接口文档的阅读,一定要仔细。最近遇到一个问题,明明文档里有说,read函数读取到的是一个或者多个events,但是代码里依然按照一个来处理。就会导致漏event的可能。漏了event,后续的逻辑就会受影响。这种读文档不仔细的例子,之前还碰到过一两次。有可能大家只是用,从来不读帮助手册,这是不可取的。原创 2023-12-05 05:34:54 · 422 阅读 · 0 评论 -
C编程风格:在静态代码检查里,有一个很重要的建议是不要使用魔数
比如下面这个变量的定义将2这个数定义在了第一次使用的前面。而且是放到了.c 文件里,也就是只限在这个文件内使用。这种只有方式的另一个好处是,避免了到头文件寻找宏定义的跳转行为。给代码阅读带来便利。如果不是公用的宏定义,就不要放到头文件里。原创 2023-12-03 21:27:15 · 358 阅读 · 0 评论 -
C/C++:warning: ISO C++17 does not allow ‘register‘ storage class specifier [-Wregister]
目前编译器已经可以对变量做优化,不需要特意做register定义变量。这个警告的意思是说,已经不建议使用register关键字来定义变量。原创 2023-11-03 10:02:07 · 1022 阅读 · 0 评论 -
c++: error: redeclaration of C++ built-in type ‘bool‘ [-fpermissive]
假如在程序里自己定义了bool这个类型,会和C++内置的类型bool冲突。可以使用 -fpermissive 来隐藏这个错误。但是一般不建议这么干。原创 2023-11-02 21:28:12 · 462 阅读 · 0 评论 -
gcc: C++: COMDAT;linkonce
这里也有提到,调试信息的大部分是关于类型的信息,而且这个调试信息种很多类型是重复的,因为在这个编译单元有,在另一个可能也有,这就重复了。为了控制这种重复,就用到了一个单独的COMDAT .debug_info 段,可以方便连接器辨识以及去除重复的信息。这两个是一个意思,都是“公用的数据”,就是多个编译单元都会用到的。比如在header文件里定义的类,如果多个cpp使用,这个类的类型就是公用的数据。这个comdat和linkonce有一定的关系,都是在说在link的阶段做优化。原创 2023-11-01 16:51:34 · 157 阅读 · 0 评论 -
c:变参函数:汇编解析;va_list;marco 宏:__VA_ARGS__
宏定义:使用的时builtin_va_end 宏定义。使用到了下列内置函数来实现va-start、end、arg相关的宏。static rtx。原创 2023-10-25 15:14:49 · 437 阅读 · 0 评论 -
c验证小程序
下面这段代码用c编译器报错,用c++编译器编译没有问题。需要两个参数,一个是int型的长度,一个是字符串地址。原创 2020-08-19 21:56:40 · 322 阅读 · 1 评论 -
C:warning: null argument where non-null required (argument 2) [-Wnonnull]
为什么要加这个属性?就是在第三个参数不为0的情况下,如果s1和s2有一个是null,那么就会发生SegV。这个意思说,函数定义里面由一个attribute,标记第二个参数不能为空。比如这个memcmp的第一个和第二个参数;原创 2023-10-17 08:57:27 · 987 阅读 · 0 评论 -
[探究] program break (chatgpt 协助)
这里说的程序断点(program break)和 gdb调试时的断点(运行断点),意思不同。当深入研究Linux和类Unix操作系统的历史时,会遇到一个在内存管理中具有历史意义的术语 - “程序断点”(Program Break)。相应的有brk/sbrk的两个函数,都是调用系统调用brk,来实现修改program break的值,在进程的动态内存分配中扮演着至关重要的角色。但是这个break 已经完全脱离“休息,断点“的概念。其实设置的是程序使用内存的一个最大值(同时还要遵守系统设置的限制)。原创 2023-10-12 08:23:10 · 155 阅读 · 0 评论 -
c/c++: ‘sizeof’ on array function parameter ‘b’ will return size of ‘int *’ Wsizeof-array-argument
id=6940;这个bug添加了这个警告。和外围定义的数组的sizeof 用法不一样,导致初学者的困惑。这个警告的含义,是说sizeof如果作用在函数参数上,而且这个参数的类型是一个数组,就会返回此类型的指针大小。从标准文档上看,有说,数组类型不能作为函数的返回值,而且数组类型的参数,会转换为指针类型的参数。原创 2023-09-25 17:42:39 · 275 阅读 · 0 评论 -
glibc: dup/dup2/dup3/F_DUPFD
标准输入输出,所对应的file descriptor,是0、1、2,如果想将其他的文件描述符对应到这几个上,也需要使用dup。然后这样对于这个线程来说,这个标准输入与输出就映射到其他的文件描述符,方便实现相关功能,管道,socket pair,线程间通信。都不知道为什么这个dup来,dup去的,有啥意思?比如下面的操作,第一步,用openat打开一个只读的文件,第二步lseek,第三步,用读写打开,再dup。因为这个dup的行为,就是为文件的操作,多设置几个文件描述符,看似没有什么太大的用途。原创 2023-09-22 20:48:20 · 233 阅读 · 0 评论 -
glibc: strlcpy
从这里看,这个strlcpy、strlcat的引入glibc的过程还是很慢长。为什么一直没有放进来?其实还是很方便使用。Kernel里的版本;原创 2023-09-16 16:47:07 · 337 阅读 · 0 评论 -
每日疑问:为什么需要MARK宏?
为什么需要MARK宏?原创 2023-08-13 10:46:06 · 72 阅读 · 0 评论 -
C:error: expected declaration specifiers or ‘...’ before ‘size_t’
这个错误的原因是,size_t 未定义时。此时使用就会提示这个错误。原创 2023-07-02 21:59:42 · 344 阅读 · 0 评论 -
C: fatal error: jni.h: No such file or directory
需要加上 jni.h文件的路径,-I;需要根据java、jdk的安装路径来确定。编译时缺少相应的文件;原创 2023-06-21 09:45:25 · 429 阅读 · 0 评论 -
C++: virtual 关键字
基类的析构函数必须是virtual的,这样才能保证,在强制类型转换子类到基类的,析构函数调用是子类的析构函数。原创 2023-06-12 21:12:20 · 70 阅读 · 0 评论 -
C:warning: missing whitespace after the macro name
这里是说缺少空格,宏名称后面如果还有其他字符,那么中间需要有空格。在语法上这个/将宏名称限定在之前。而且这个是除号的标识。原创 2023-06-09 07:56:33 · 1722 阅读 · 0 评论 -
C++: error: bitwise operation between different enumeration types (‘xxx‘ and ‘bbb’) is deprecated
新的版本里c++20默认,不让做不同enum类型的比较,转换。这是一个避免错误的方法,应该建议使用。而且这种问题调试的时候,非常困难。原创 2023-06-01 08:47:03 · 371 阅读 · 0 评论 -
C: warning C275: expression with possibly no effect
这里有一段程序,明显这个语句是逻辑判断,但是被当作了赋值语句。而且这个逻辑判断的结果程序里没有使用。然后才有这个警告,说表达式没有任何结果,没有任何作用。原创 2023-05-27 18:53:29 · 2752 阅读 · 0 评论 -
C:VS:error:C2614:非法成员初始化,xx不是基或成员
非法成员初始化,xx不是基或成员;自己的感觉是这个翻译不是很顺滑。起码得翻译成基类,而不是基。这个错误的产生是一个意识问题,就是说。对于刚入门的人来说,继承来的成员,也是自身成员,应该可以直接在子类的构造函数的初始化列表使用。但其实如果细想一想,会发现,如果子类可以初始化父类里的成员的话,可能会有些问题。父类里的成员需要使用父类构造函数初始化。像这种基础的问题,需要系统的学,记。不知道GCC版的中文会如何显示;原创 2023-05-21 06:49:14 · 1017 阅读 · 0 评论 -
硬件:井号的含义
C里是这样:https://mzhan017.blog.csdn.net/article/details/124186104。比如这里,就是在说:如果信号后面有#号,代表的是低电压时断言状态;而没有井号时代表:高电压断言状态。如果想融入其中,就需要记住这些个方言的使用方法,表达方式;井号在不同的语境、方言里所表达的含义不同;怎么说呢,其实这就是一种方言;shell里是注释;原创 2022-10-16 08:19:42 · 1352 阅读 · 2 评论 -
C: warning: format %lx expects argument of type uint64_t {aka long long unsigned int} %llx
对应32位的程序,如果写出以下的代码,可能出现的情况是,后面想要打印的b值,输出的却是0;0是a的高地址内存地址存放的一个值。原因是,对应32位程序来说,%lx对应的是一个4字节内存,所以第一个%lx消耗掉4个字节,而变量a的内存是8个字节,没有消耗完,导致第二个%lx吃掉没有消耗完的a的内存4个高地址字节。这个警告的意思是:%lx这个格式对应的数据类型是uint64_t,也就是long long unsigned;原创 2023-04-07 03:13:18 · 1160 阅读 · 0 评论 -
C:warning: “__has_attribute“ is not defined [-Wundef]
gcc的版本比linux kernel需要的版本低。需要用8.5之上的gcc进行编译。原创 2023-04-04 16:29:06 · 410 阅读 · 0 评论 -
C: = 与 == 的意识转换
但是在C里等于号的意义完全变了,等于代表了赋值。而两个等号 ==,才是真正的判断两端是否相等。一定要完成这种意识转换。因为等号与两个等号,在C里都是合法的操作符,编译时不会出现错误,只有运行时才会出现错误。如果测试范围不全,很容易就遗漏问题的发现。高中及之前的数学里都有等于符号,代表,两端相等。原创 2023-04-02 08:11:08 · 49 阅读 · 0 评论 -
C: 整数类型(整型)基础
C里的关键字unsigned是整数类型的修饰符代表,无符号整型(就是:非负数)。而有符号用signed标识,但是一般的用法是这个signed可以省略,表示默认就代表有符号。而且已经达成了共识,没有unsigned/signed 关键字是默认代表是signed,有符号数。这里需要注意,具体的存储大小需要根据32位机和64位机,以及CPU的架构而定;其他的整数修饰符是long,short,故名思意就是可以表示更多,或者更少的整数。两个大数相加可能导致整数溢出,因为存储单元的容量有限,不能表示无限大的整数。原创 2023-03-21 04:57:03 · 158 阅读 · 0 评论 -
c/c++: Error: junk `$(comma)%ymm1‘ after register
这个是汇编器报出的错误,意思是说,在寄存器后面有一个垃圾串,起始是期望后面有一个分隔符,或者由语法意义的字符串。原创 2023-03-20 21:10:45 · 145 阅读 · 0 评论