
C/C++
C/C++的相关技术及实例
优惠券已抵扣
余额抵扣
还需支付
¥159.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
风静如云
风起则飞扬,风平则静安!
展开
-
nlohmann json:检查类型并取出数据
编译:$ g++ -o m1 m1.cpp -std=c++20。原创 2025-05-21 15:31:22 · 99 阅读 · 0 评论 -
GCC:取消private访问限制
【代码】GCC:取消private访问限制。原创 2025-05-15 09:55:30 · 27 阅读 · 0 评论 -
GoogleTest:GMock2 EXPECT_CALL
EXPECT_CALL的第二个参数是对象的方法名,可以通过匹配参数器,指定期望传进来的参数,比如上例的EXPECT_CALL(person, setAge(20)),就是代表期望传递进函数setAge的参数是20,当然也可以使用一些预定义的宏,比如Ge,Eq,可以参考。需要说明的是不仅仅可以MOCK_METHOD定义重载的虚函数,普通函数也可以通过MOCK_METHOD定义,比如上面代码中的TEST(PersonMock, setAge20)如果参考可以是任何值,那么可以使用"_",参考setAge18;原创 2025-05-14 22:24:37 · 75 阅读 · 0 评论 -
GoogleTest:GMock1初识
项目通常是多人并行开发的,有的时候需要使用别人开发的接口,但是在测试的时候却不一定都已经开发完成了,这个时候可以使用GMock进行模拟。3.4通过EXPECT_CALL设置Mock对象的接口行为,比如上面WillRepeatedly表示会一直返回。3.2然后通过MOCK_METHOD0定义一个mock接口函数。3.1需要先通过类继承定义一个Mock类。3.5然后通过EXPECT_EQ完成测试项。3.3在TEST内部定义一个Mock对象。使用gmock需要包含以下头文件。编译gmock需要链接以下库。原创 2025-05-05 20:49:34 · 98 阅读 · 0 评论 -
GoogleTest:TEST_F
简单点说,就是需要先定义一个继承于testing::Test的类,然后有两个虚函数,SetUp()用于每次构建测试项时需要完成的准备工作,TearDown()用于每次完成测试项的收尾工作。可以看到每个测试项开始时都会构造TestT2对象,然后调用SetUp准备数据,即使同一个测试用例的不同测试项之间,TestT2对象也不是共享的,每个测试项都会构造自己的TestT2对象。1.构造TestT2的对象,而由于TestT2的对象有成员T2,所以T2也会被构造。5.析构TestT2的对象,同时析构成员T2。原创 2025-05-02 23:19:51 · 158 阅读 · 0 评论 -
GoogleTest:简单示例及ASSERT/EXPECT说明
TestItem用于定义某个测试项,比如上面针对int,float,string的测试项,多个测试项可以对应于同一个测试用例,比如TEST(Add, Int)和TEST(Add, String)5.1编写测试测试用例不需要写main函数,也不能有main函数,main函数其实是使用的定义在 libgtest_main.a中的静态函数。5.4.2 EXPECT的作用是如果当前的断言没有通过,那么会继续执行后面的语句,但是不会执行ASSERT和EXPECT语句。但是不会影响本测试用例的其他测试项。原创 2025-05-01 18:47:55 · 174 阅读 · 0 评论 -
GoogleTest:在Ubuntu22.04安装
1.首先克隆GoogleTest。原创 2025-04-28 21:46:38 · 163 阅读 · 0 评论 -
CMake:设置编译C++的版本
如果设置为 `ON`,那么 CMake 会要求编译器必须支持CMAKE_CXX_STANDARD中设置的 C++ 版本,否则会配置失败。如果设置为OFF或者未设置,那么如果编译器不支持 CMAKE_CXX_STANDARD中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本。CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23。原创 2025-04-28 21:33:32 · 247 阅读 · 0 评论 -
C++(17):通过filesystem获取文件的大小
介绍了如何获取文件的大小。原创 2025-04-18 15:02:04 · 73 阅读 · 0 评论 -
Boost:callable_traits::args_t
是 Boost CallableTraits 库中的一个模板工具,用于提取可调用对象(如函数、函数指针、成员函数指针或 lambda 表达式)的参数类型列表,并将其表示为一个。原创 2025-04-14 09:00:00 · 40 阅读 · 0 评论 -
C++(17):通过filesytem遍历目录
而且recursive_directory_iterator还是一个运行时迭代器,会在运行时逐步访问目录中的文件和子目录,而不是一次性加载所有内容。这意味着当调用该函数时,迭代器将不会进入当前目录的子目录,而是跳过它们,继续处理下一个目录或文件。recursive_directory_iterator会从指定的目录开始,递归地访问该目录中的所有文件和子目录,直到遍历完整个目录树。recursive_directory_iterator是一个迭代器,用于递归地遍历指定目录及其所有子目录中的文件和子目录。原创 2025-04-12 22:06:43 · 355 阅读 · 0 评论 -
C++:通用的log输出
可以看到通过nlohmann可以较方便的将数据结构转换为字符串,我们可以利用这个方式实现一个较为方便且通用的log输出。编译:g++ -o m ./main.cpp -std=c++20。可以看到直接输出复杂的数据结构,比较方便直接输出调试信息。原创 2025-03-24 17:07:43 · 174 阅读 · 0 评论 -
C++(17):为optional类型构造对象
介绍了optional做为函数返回值的一种方式。其实optional也可以作为对象来使用。原创 2025-02-21 21:53:09 · 71 阅读 · 0 评论 -
C++(23):利用this参数更方便的实现CRTP
介绍了C++23为类成员引入了this参数。可以看到,实现了CRTP。原创 2025-02-19 21:48:29 · 188 阅读 · 0 评论 -
C++(23):为类成员函数增加this参数
可以看到通过这种方式可以更方便的基于this对象的类型对函数进行重载。原创 2025-02-19 21:33:37 · 103 阅读 · 0 评论 -
C++(23):lambda可以省略()
【代码】C++(23):lambda可以省略()原创 2025-02-19 21:26:11 · 95 阅读 · 0 评论 -
C++(23):unreachable
2.调用func(1)并没有引起程序段错误,程序还顺利的执行完了,只是忽略掉了std::unreachable()后面的代码。这两个意外,让我暂时还没有搞清楚unreachable的具体作用是什么,日后了解了,再进行补充。1.func(1);明显的进入了unreachable,但编译的时候并没有报错。原创 2025-02-18 21:42:57 · 104 阅读 · 0 评论 -
C++(23):支持多维数组运算符
当然如果不想处理访问越界的情况,可以不必处理数组索引的检查。可以看到通过这种方式可以更为便捷的访问多维数组。原创 2025-02-18 21:17:40 · 727 阅读 · 0 评论 -
C++:将函数参数定义为const T&的意义
中由于传递的参数是const char*, 所以还是需要构造一个一个MyData对象。确实没有调用拷贝构造函数,而doTest2(d);:通过引用传递参数而不是值传递,可以避免对象的拷贝,从而提高性能,特别是当对象较大时。C++很多函数的参数都会定义为const T&,那么这么做的意义是什么呢?同理:doTest2("hello2");关键字可以防止函数修改传入的参数,确保数据的安全性和一致性。对于这种情况,const T&可以节省一次拷贝构造函数。所以对于这种情况,两者其实没有什么效率上的区别。原创 2025-02-09 22:08:26 · 291 阅读 · 0 评论 -
Boost:通过boost::process::child完成带管道的调用
可以看到实现了管道的调用。原创 2025-02-07 13:38:54 · 178 阅读 · 0 评论 -
C++:通过标识获取子字符串
这是一个常用的方式,比如通过成对括号,引号获取字符串。原创 2024-12-25 15:23:13 · 113 阅读 · 0 评论 -
Boost:通过boost::process::child调用其他程序时设置起始目录,环境变量,捕获错误
3.可以通过boost::this_process::environment();产生一个环境变量对象,并设置环境变量的key-value,但是这个方式是v1的方式,根据boost的文档,后续会使用v2的方式。2.通过boost::process::start_dir设置程序执行时的初始目录,因为程序执行时不太可能通过类似cd xxx这样的命令进入某个目录,所以当需要时,可以通过start_dir进行设置。而 exit_code用于识别程序完成时是否正确的执行了。原创 2024-12-23 14:56:51 · 162 阅读 · 0 评论 -
C++14:通过make_index_sequence实现将tuple转换为array
需要说明的是,array中的元素是同一类型,因此需要tuple中的元素都支持转换为首元素类型。通过该方法,可以把tuple中的元素转换为tuple首元素类型的array。如何将vector转换为array呢。原创 2024-10-01 10:03:31 · 155 阅读 · 0 评论 -
nlohmann json:读写json文件
的方式是当读取的文件无法匹配json的格式时不抛出异常。3. j.is_discarded()用于判断是否正确的读取到了json内容。原创 2024-09-25 23:01:05 · 639 阅读 · 0 评论 -
GDB:调试加载coredump文件
C/C++语言,程序编写不当,就会产生coredump,可以通过gdb进行调试,快速定位coredump的位置。使用两种方式均可以正确的加载core文件,通过以下方式可以快速的定位coredump。可以看到对空指针d进行复制,导致了coreddump。运行程序后,不出所料参数了coredump。可以通过两种方式加载core文件。原创 2024-09-06 22:07:52 · 356 阅读 · 0 评论 -
GDB:加载符号表
如:strip --strip-debug --strip-unneeded c。介绍了调试coredump时需要通过-g编译程序,从而产生调试程序所需要的信息。如:objcopy --only-keep-debug c c_symbol。通过这种方式可以将符号表文件c_symbol 加回到可执行文件c。c_symbol: 文件格式 elf64-x86-64。c: 文件格式 elf64-x86-64。如:objcopy --strip-all c。可以看到又可以看到有意义的符号信息了。原创 2024-09-06 22:37:20 · 1135 阅读 · 0 评论 -
GDB:产生core文件
core文件是调试段错误的重要手段,默认情况下是不会生成core文件的,可通过如下方式对生成core文件进行设置:1.打开core开关可以先通过ulimit -c,进行查看,如果输出为0,表示不会生成core文件可以通过ulimit -c[filesize] 或ulimit -cunlimited对core文件的大小进行设置如果希望每次打开bash这个设置都处于生效状态,可以把ulimit -c unlimited写入bash配置文件:~/.bashrc2.core文件的生成位置...原创 2022-05-28 12:59:05 · 2753 阅读 · 0 评论 -
GDB:调试时传递参数
1.运行gdb时通过--args传递参数。2.在gdb中执行run的时候传递参数。3.在run之前通过set传递参数。可以看到参数传递到了程序中。同样参数传递到了程序中。原创 2024-08-24 20:36:32 · 655 阅读 · 0 评论 -
C++(23):新的错误返回机制expected
4.调用函数时返回的expected值,如果转bool后为true,代表函数正确的执行了,可以通过类似*result或result.value()获取到返回值。5.如果函数执行错误了,那么可以通过result.error()返回错误对象,比如DivE,继而通过错误对象得到错误值result.error().err。2.expected的第二个模版参数DivE代表的是函数执行错误时的类型,可以是原生类型也可以是自定义类型。传统的C++程序,有的时候既想要知道函数是否正确的执行了,又想要知道返回的结果。原创 2024-07-28 21:54:32 · 357 阅读 · 0 评论 -
C++(20):存储utf8的char8_t类型
2.char8_t具有和unsigned char相同的符号属性、存储大小、对齐方式以及整数转换等级,但不是unsigned char。3.由于char8_t和unsigned char不是用一种类型,所以其指针间也不同直接赋值。C++23中可以将utf8数据直接保存在char8_t变量中。1.char8_t的字面量类型通过u8定义。原创 2024-07-28 16:09:29 · 288 阅读 · 0 评论 -
C++:CLI11命令行分析工具
1.创建目录/usr/include/CLI,然后将release中的CLI11.hpp拷贝到/usr/include/CLI中。CLI11使用起来比较简单,源码下的example目录下有很多例子可以参考。2.将源码中的CLI目录拷贝到/usr/include/目录中。CLI11是一个比较方便的命令行分析工具。使用时直接引入头文件即可,不需要库文件。可以对输入的值进行检查。原创 2024-07-21 20:56:36 · 307 阅读 · 0 评论 -
C++(23):多维数组下标
可以看到C++23中的operator[]可以支持多个参数表示的多个维度了。原创 2024-07-02 21:42:32 · 198 阅读 · 0 评论 -
C++:查找两个目录中的不同文件
可以看到准确的找出了两个目录中文件的不同。原创 2024-06-30 14:39:47 · 197 阅读 · 0 评论 -
C++:查找重复文件
【代码】C++:查找重复文件。原创 2024-06-11 22:30:16 · 185 阅读 · 0 评论 -
C:STDIN_FILENO和stdin的区别
可以看到程序时可以直接使用stdout的,而不需要先通过fopen返回一个指向FILE的指针。1.STDIN_FILENO定义于文件/usr/include/unistd.h。可以看到通过STDOUT_FILENO可以直接向标准输出输出内容。作为read,write,close等系统调用的文件描述符使用。作为fopen,fprintf等io库函数的指针使用。2.stdin声明于文件stdio.h。原创 2024-05-09 22:04:37 · 304 阅读 · 0 评论 -
C:获取文件大小的两种方式
ftell可以返回文件当前位置的偏移量,所以可以先通过fseek将文件当前位置挪到尾部,然后再通过ftell获取文件的大小。2.通过fstat,该函数可以获取文件的相关信息,其中有关于文件大小的值。文件testfile.txt的内容是:123456。可以看到正确的获取了文件的大小。原创 2024-04-09 11:59:57 · 951 阅读 · 0 评论 -
C:检查字符串中是否有违法字符
2.含有某个特殊字符,且该特殊字符不是以斜杆\开头的。如果满足任意一个条件,则返回错误值。错误值代表不满足的检查项。1.含有某个特殊字符。原创 2024-04-08 09:18:27 · 347 阅读 · 0 评论 -
Linux开发:管道零拷贝splice
SPLICE_F_MOVE:如果输出是文件,这个值则会使得操作系统内核尝试从输入管道缓冲区直接将数据读入到输出地址空间,这个数据传输过程没有任何数据拷贝操作发生。假如需要通过管道在父子进程间传递一个文件的数据,那么普通的做法,是从文件中读出数据,通过管道传递,然后再将数据写回文件。off_out:如果fd_out是管道,那么必须传递NULL即可,否则表示写入数据的偏移量。off_in:如果fd_in是管道,那么必须传递NULL即可,否则表示读取数据的偏移量。fd_out:数据目的地的文件描述符。原创 2024-03-21 21:52:47 · 337 阅读 · 0 评论 -
Boost:通过noncopyable禁止拷贝和复制
可以看到由于使用的是默认拷贝构造函数,所以在构造a2时,a2.str和a1.str指向了同一块内存,因此在析构会被释放两次,造成段错误。Boost在C++11退出delete前,通过noncopyable也可以解决这个问题。可以看到noncopyable将拷贝构造和赋值运算符声明为了私有。C++11可以通过删除默认的拷贝构造和赋值运算符来解决这个问题。段错误 (核心已转储)原创 2024-03-13 21:45:43 · 151 阅读 · 0 评论 -
Boost:获取通过asio调度任务的执行结果
可以看到通过post_function_use_future发布了两个任务到asio上,并且运行在不同的执行线程上,然后可以通过get获取任务的执行结果。通过这种方法需要注意的是post_function_use_future需要传递一个没有参数的函数,所以可以通过lambda包装有参数的函数。可以看到,sayHello处理完自己的工作后,会继续发布任务,发布完任务后,会继续处理其他任务。也可以通过post_function_use_future在多个io_context中传递。原创 2024-03-07 11:39:53 · 328 阅读 · 0 评论