Boost.Asio 回调机制初步窥探

验证 Boost.Asio 开发环境 + 理解异步回调与 Qt 信号槽的对应关系 一、环境验证:异步定时器 Asio 是纯头文件库(Header-Only),不需要 b2.exe 编译,配置包含目录后即可 #include 使用。 验证代码: #include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_context io; boost::asio::steady_timer timer(io, std::chrono::seconds(3)); timer.async_wait([](const boost::system::error_code& ec) { if (!ec) { std::cout << ">>> 3s elapsed, async callback fired" << std::endl; } }); std::cout << "--- main thread continues immediately ---" << std::endl; io.run(); return 0; } 预期输出(顺序证明异步非阻塞): --- main thread continues immediately --- (3 秒间隔) >>> 3s elapsed, async callback fired 证明了三件事: ...

2026 年 10 月 13 日

C++ 基础遗漏知识点:bool、sizeof、auto、nullptr 与 static

容易被忽略但常出问题的基础语法点:bool 与 boolalpha、sizeof 的指针陷阱、auto 的 const 剥离、nullptr 与 static。 1. bool 类型与 boolalpha 核心规则 场景 结果 说明 bool b = true 输出 1 默认输出数字 bool b = false 输出 0 默认输出数字 bool b = -8 输出 1 非零即为 true bool b = 0 输出 0 零即为 false boolalpha 操纵符 使用 std::boolalpha 可以让 cout 输出 true/false 而不是 1/0。 #include <iostream> using namespace std; int main() { bool isTrue = true; // 默认输出(数字) cout << "默认: " << isTrue << endl; // 输出: 1 // 使用 boolalpha(文字) cout << boolalpha; cout << "boolalpha: " << isTrue << endl; // 输出: true // 非零值也为 true bool b = -8; cout << "-8 转 bool: " << b << endl; // 输出: true return 0; } 常见陷阱 // 陷阱1:非零即为 true bool b1 = 42; // true bool b2 = -1; // true bool b3 = 0.001; // true bool b4 = nullptr; // false (C++11) // 陷阱2:bool 与整数混合运算 int a = true + true; // a = 2(true 被提升为 1) int b = true * 10; // b = 10 2. sizeof 运算符 基本用法 #include <iostream> using namespace std; int main() { cout << "char: " << sizeof(char) << endl; // 1 cout << "short: " << sizeof(short) << endl; // 2 cout << "int: " << sizeof(int) << endl; // 4 cout << "long: " << sizeof(long) << endl; // 4 或 8 cout << "long long: " << sizeof(long long) << endl; // 8 cout << "float: " << sizeof(float) << endl; // 4 cout << "double: " << sizeof(double) << endl; // 8 // 数组 int arr[10]; cout << "int[10]: " << sizeof(arr) << endl; // 40 // 指针 int* p; cout << "int*: " << sizeof(p) << endl; // 4 或 8 return 0; } 动态数组的 sizeof 陷阱 int* arr = new int[10]; cout << sizeof(arr) << endl; // 输出 4 或 8(指针大小,不是数组大小!) // 正确获取动态数组大小:需要额外传参或用 vector 3. auto 关键字(C++11) 基本用法 auto x = 42; // int auto y = 3.14; // double auto z = "hello"; // const char* auto flag = true; // bool // 推荐用于复杂类型 #include <vector> #include <map> std::vector<int> v = {1, 2, 3}; auto it = v.begin(); // std::vector<int>::iterator std::map<std::string, int> m; auto pair = std::make_pair("key", 1); 注意事项 // auto 会忽略顶层 const const int a = 10; auto b = a; // b 是 int,不是 const int const auto c = a; // c 是 const int // 引用形式的 auto 才保留底层 const const int& ref = a; auto ref2 = ref; // ref2 是 int 拷贝——普通 auto 剥离引用,连同底层 const 一起丢 auto& ref3 = ref; // ref3 是 const int&——auto& 保留底层 const(不能改 *ref3) 4. nullptr(C++11) 与 NULL 的区别 // NULL 在 C++ 中可能是 0 或 (void*)0 void func(int); void func(char*); func(NULL); // 编译错误!歧义 func(nullptr); // OK,调用 func(char*) 最佳实践 // 初始化指针 int* p = nullptr; // 判断指针 if (p != nullptr) { // 使用 p } // 函数参数 void foo(int* ptr) { if (ptr == nullptr) { return; } } 5. const 与 constexpr(简记) 特性 const constexpr 初始化时机 运行时 编译时 可用于函数返回值 是 是 编译期常量 否 是 const int x = 10; // OK constexpr int y = 20; // OK,编译期常量 // constexpr 函数 constexpr int square(int n) { return n * n; } constexpr int val = square(5); // 编译期计算 const 与 constexpr 的完整对比、constexpr 函数、if constexpr、C++20 的 consteval/constinit,见另一篇《C++ namespace、const 与 constexpr 知识点总结》。 ...

2026 年 10 月 13 日

VS 向导 vs CMake 手建工程:一次取舍记录

新建 C++ 项目时,用 VS2022 项目向导,还是手建目录 + CMake?核心结论:向导是「快」,CMake 手建是「稳」;长期维护的 Boost + OpenCV 项目走 CMake 手建路线。 一、「完全不利用 VS 向导」指什么 VS 新建项目时,向导会自动生成: 目录结构 .vcxproj / .sln 一些默认代码 默认的编译配置 不用向导,就是自己手建目录、手写 CMakeLists.txt、用 VS 的「打开文件夹」模式加载。 二、CMake 手建的好处 # 好处 说明 1 结构清晰、可控 向导生成的项目,目录和配置是向导定的;手建时 src/、include/、resources/、tests/ 怎么分,自己说了算 2 跨平台 CMakeLists.txt 是跨平台的:同一个项目,Windows 用 MSVC,WSL 用 GCC,不用改任何东西;向导生成的 .vcxproj 只能在 VS 里用 3 依赖管理统一 Boost、OpenCV 全走 find_package,环境变量一配,所有项目通用;向导的项目要手动一个个加 include、lib 路径 4 不污染仓库 .vcxproj、.sln、.vs/、out/ 都是本地文件,不进 Git;CMake 项目只需提交 CMakeLists.txt 和源码,干净 5 和工业界一致 大多数 C++ 开源项目、跨平台项目都用 CMake;养成这个习惯,以后参与别人的项目、或自己发布项目,都顺 6 配置一次、项目复用 环境变量和 CMakeLists.txt 模板定好后,新建项目就是复制模板、改项目名、加源文件。增量配置,不是每次从零配 三、CMake 手建的代价 初期配置复杂。第一次要理解:CMakeLists.txt 的语法、find_package 怎么找库、环境变量怎么设、CMakePresets.json 的格式。这些概念对新手是门槛。 VS 集成不如原生项目「顺滑」。向导项目是 VS 原生支持,调试、IntelliSense 开箱即用;CMake 项目通过「打开文件夹」或「CMake 项目」模式支持,功能也全,但偶尔会遇到配置识别问题。 调试和 IDE 功能偶有摩擦。断点、监视窗口、调用栈这些都没问题;但某些 VS 特有的功能(比如某些项目属性页面),在 CMake 项目里没有对应入口。 学习曲线。要同时学 CMake、学 Boost/OpenCV 的 CMake 配置。一次性投入大,但长期收益高。 四、取舍小结 整体体验是:结构清晰,配置相对复杂;不过做项目时配置一次,后续只是增量配置。 ...

2026 年 10 月 13 日