'undefined reference to vtable for'

需求 今天编译的时候,报错 undefined reference to vtable for. 解决 这个报错就是说的虚函数没有找到对应的定义。经过多次仔细的检查后,发现是某个暂时没有用到的纯虚函数,在子类中没有相应的函数体。给这个函数加上 {} 就可以暂时解决了。 参考 C++ 基类继承 出现undefined reference to vtable for Cxxx错误 QT cmake编译时总显示undefined reference to `vtable for xxx‘ C++ 从命令行编译一个Qt单个文件:对vtable的未定义引用

<span title='2023-04-11 18:06:00 +0800 CST'>2023-04-11</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

c++ 用于解析 xml 文件的第三方库

需求 在 C++ 环境下,能够解析 xml 文件的第三方库? 解决 经过尝试之后,比较合适的是 tinyxml 这个第三方库,可以创建,插入,删除,修改,解析 xml 文件。 参考 C/C++ 使用 tinyxml库 操作XML格式文件(创建、插入、删除、修改、解析) C++解析XML TinyXML Files

<span title='2023-04-10 20:48:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;20 words&nbsp;·&nbsp;RamLife

fwrite 返回值并不是字节数

需求 使用 fwrite 写入时,返回值和字节数目对应不上,这是什么情况? 解决 因为 fwrite 和 write 之类的系统直接提供的接口不一样, fwrite 返回的是写入的数据块的个数。如果数据是以字节作为数据来写入,那么返回值就是字节数,否则返回值是和 count 这个参数相关联,而不是单纯的字节数。 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); // -- buffer:指向数据块的指针 // -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4) // -- count:数据个数 // -- stream:文件指针 参考 fwrite()的返回值随着格式的不同返回值也不同; fopen()、fwrite()、fread()函数使用说明与示例 C 库函数 - fwrite()

<span title='2023-04-10 18:04:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;43 words&nbsp;·&nbsp;RamLife

c++ utf8 和 utf16 转换

需求 有一个 xml 文件,是 utf16-be 格式的,直接使用 firefox 打开不对,所以考虑先转码为 utf8 然后再打开。 解决 int Utf16leToUtf8(uint8_t* dest, int dest_size, int* dest_len, uint16_t* src, int src_len) { uint8_t* dest_start = dest; uint8_t* dest_end = dest + dest_size; //uint16_t* src_end = (uint16_t*)((uint8_t*)src + src_len); uint16_t* src_end = src + src_len; while (src < src_end) { if (*src < UTF16_2 && dest + 1 < dest_end) { //0000 - 007F : 0xxxxxxx *dest++ = (uint8_t)*src; } else if(*src >= UTF16_2 && *src < UTF16_3 && dest + 2 < dest_end) { //0080 - 07FF : 110xxxxx 10xxxxxx *dest++ = ((*src >> 6) & 0x1F) | 0xC0; *dest++ = (*src & 0x3F) | 0x80; } else if(*src >= UTF16_3 && *src < UTF16_4 && dest + 3 < dest_end) { //0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx *dest++ = ((*src >> 12) & 0x0F) | 0xE0; *dest++ = ((*src >> 6) & 0x3F) | 0x80; *dest++ = (*src & 0x3F) | 0x80; } else if(*src >= UTF16_4 && *src < UTF16_4_SECOND && dest + 4 < dest_end) { // 代理项对部分(4字节表示) //0001 0000 - 001F FFFF : 1111 0xxx 10xxxxxx 10xxxxxx 10xxxxxx // 从代理项对到UNICODE代码点转换 // 1、从高代理项减去0xD800,获取有效10bit // 2、从低代理项减去0xDC00,获取有效10bit // 3、加上0x10000,获取UNICODE代码点值 uint16_t high_sur = *src++; uint16_t low_sur = *src; uint32_t code_point = high_sur - UTF16_4; code_point <<= 10; code_point |= low_sur - UTF16_4_SECOND; code_point += UTF16_4_PLUS; *dest++ = (code_point >> 18) | 0xF0; *dest++ = ((code_point >> 12) & 0x3F) | 0x80; *dest++ = ((code_point >> 06) & 0x3F) | 0x80; *dest++ = (code_point & 0x3F) | 0x80; } else { break; } src++; } *dest = 0; *dest_len = dest - dest_start; if (src < src_end) { return -1; } return 0; } int Utf16beToUtf8(uint8_t* dest, int dest_size, int* dest_len, uint16_t* src, int src_len) { uint16_t le[src_len]; union { uint16_t s; uint8_t buf[sizeof(uint16_t)]; } data; for (int i = 0; i < src_len; i++) { /* uint8_t * d = (uint8_t *)(src + i); uint8_t tmp = *d; *d = *(d + 1); *(d + 1) = tmp; */ data....

<span title='2023-04-10 16:51:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;367 words&nbsp;·&nbsp;RamLife

c++ 类中初始化另外一个类只可以用 {} 和 =

需求 在类中初始化另外一个类使用什么符号呢? () 可以吗? 解决 在类中给成员变量初始化只能用 {} 和 = ,不可以使用 (). 一般推荐 {} 这样的统一初始化形式。 参考 为何在类中初始化另一个类会出错? Non-static data members 构造函数与成员初始化器列表

<span title='2023-04-10 16:51:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;20 words&nbsp;·&nbsp;RamLife

c++ 获取类的名称

需求 希望获取类的名称. 解决 使用 typeid 即可。 #include <typeinfo.h> std::string getClassName() { return typeid(*this).name(); } 参考 获取类实例的类名(c++)

<span title='2023-04-10 16:51:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;16 words&nbsp;·&nbsp;RamLife

从 stringstream 中获取拼接后的 string

需求 如何从 stringstream 中获取多次拼接后的 string, 直接使用 >> 效果并不好. 解决 使用 stringstream 的 str() 这个类函数。 stringstream ss; string s = ""; ss << "123"; ss << "456"; s = ss.str(); 参考 c++ stringstream(老好用了)

<span title='2023-04-06 16:51:00 +0800 CST'>2023-04-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;32 words&nbsp;·&nbsp;RamLife

printf 16进制大写输出,并且左补零

需求 在某些情况下,需要打印的数据,16进制表现形式,并且达到固定的位数,不足的左边补零。 解决 snprintf(tmp, sizeof(tmp), "%04X", ack.command); % 格式说明的起始符号 0 空位补0 m.n m指宽度,n指小数精度 X 16进制大写字符 参考 printf()如何进行“左补零”的操作 c语言printf()输出格式大全 C语言printf指定宽度的格式化输出 C语言中sprintf()函数的用法

<span title='2023-04-05 16:40:00 +0800 CST'>2023-04-05</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;20 words&nbsp;·&nbsp;RamLife

删除消息队列

需求 编程调试的时候,如果用到了消息队列,难免会消息队列中有残余信息的情况,并且如果希望在服务程序结束前就清除这些消息队列,那就需要在 shell 中使用命令进行删除。 解决 消息队列属于 IPC 的一部分,使用的命令也是 IPC 的系列命令中的 ipcrm. 查看消息队列情况 ipcs -q 删除指定 key 的消息队列,一般我们经常用这个,因为 key 一般是我们自己设定的。 ipcrm -Q 1234 删除指定 id 的消息队列 ipcrm -q 1234 如果程序是使用 sudo 来启动的,那么删除的时候,也需要 sudo, 否则没有权限. 参考 ipcs, ipcrm 命令 linux下消息队列的查看与删除(ipcs&ipcrm的使用) 请问Linux下如何清除消息队列queue中的内容??

<span title='2023-04-04 11:55:00 +0800 CST'>2023-04-04</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;39 words&nbsp;·&nbsp;RamLife

修改消息队列的大小

需求 因为需要在多个进程之间通过消息队列传输数据,所以需要加大消息队列的大小。 解决 首先确定使用的是 System V 还是 POSIX 的消息队列,这两种从 API 到配置都不一样。本文主要提的是 System V 的消息队列。 System V 查看当前系统中的设置 cat /proc/sys/kernel/msgmni cat /proc/sys/kernel/msgmax cat /proc/sys/kernel/msgmnb # 查看当前使用 ipcs -u # 查看限制 ipcs -l 修改配置 System V 的消息队列配置文件是 /etc/sysctl.conf 这个总的配置文件或者 /etc/sysctl.d/ 文件夹下面的细分配置文件。 sudo vim /etc/sysctl.d/11-message-queue.conf # set message queue # set message number of any queue kernel.msgmni = 312 # set one message max size kernel.msgmax = 8192 # set all message totall max size kernel....

<span title='2023-03-23 14:26:00 +0800 CST'>2023-03-23</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;129 words&nbsp;·&nbsp;RamLife