gcc 生成中间文件

需求 gcc 如何生成中间文件 解决 预处理 生成 .i 文件。 gcc -E hello.c g++ -E test.cpp -o test.ii # 阻止源文件和头文件中的注释 g++ -E -C test.cpp -o test.ii 编译 生成 .s 文件 gcc -S hello.c g++ -S test.ii g++ -S test.ii -o demo.s g++ -S test.cpp -o test.s # 添加必要注释 g++ -S test.cpp -o test.s -fverbose-asm 汇编 生成 .o 文件 gcc -c hello.c g++ -c test.s g++ -c test.s -o test_obj.o 链接 生成 .out 文件...

2023-04-14 · 1 min · 108 words · RamLife

gitea pull requst 配置和使用

需求 gitea 中当某个仓库需要开发组多人使用时,就不太适合直接推送,而是应该使用 pull request 来管理合并了。使用时需要如何配置,才能满足多人请求,单人审核的权限需求,以及选用哪种方法进行合并? 解决 分支 master 只能从 release 合并过来。仓库设置 -> branch 开启分支推送保护,并且合并白名单设置只能指定的测试人员才能把 release 中的某个提交合并到 master 上去。 develop 不能直接推送,必须从其他的个人分支合并过来。也是开启分支推送保护,并且合并白名单只能由管理员才能合并过来。 权限 leader 管理员的权限需求为: 不能删除仓库 管理仓库的方方面面 管理从其他分支到 develop 分支的合并 解决方法即为: 在组织中创建 team, 命名为 admin , 设置为 spec repo 和 admin access 即可。 把允许管理的仓库添加给 admin team. 只要不是 own team, 就不能删除仓库。 把 admin team 加入到 develop 的合并白名单 把具体的 leader 加入到这个 admin team 中去。 develop 开发人员的权限需求为: 可以推送除了 master, develop, release 以外的分支 只访问允许的仓库 解决方法为...

2023-04-13 · 1 min · 145 words · RamLife

构造函数可以调用成员函数吗?

需求 构造函数中可以使用成员函数吗? 如何可以的话,就可以多个构造函数,通过调用同一个成员函数,来提高代码复用。 解决 构造函数可以直接调用成员函数,因为成员函数在编译期就已经定下来了,在运行期执行构造函数,调用成员函数没有问题。 参考 构造函数中调用成员函数??

2023-04-12 · 1 min · 7 words · RamLife

'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的未定义引用

2023-04-11 · 1 min · 29 words · RamLife

如何查看 xml 文件

需求 手里面有个 xml 文件,使用 notepad 查看不方便,希望有合适的查看工具。 解决 notepad++ 之类的升级版的编辑软件 firefox 之类的浏览器直接打开 xml-viewer 之类的专用软件 参考 How to View XML Files 推荐一个好用而且免费的XML文件查看工具,高效,易用而且可定制

2023-04-11 · 1 min · 20 words · RamLife

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

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

2023-04-10 · 1 min · 20 words · 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()

2023-04-10 · 1 min · 43 words · 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....

2023-04-10 · 2 min · 367 words · RamLife

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

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

2023-04-10 · 1 min · 20 words · RamLife

c++ 获取类的名称

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

2023-04-10 · 1 min · 16 words · RamLife