尧图精选

C++ 快速参考备忘清单:语法基础、智能指针与多线程并发实战

🕒 发布时间:2026/9/14 21:31:39 📁 来源:尧图网络
C 快速参考备忘清单语法基础、智能指针与多线程并发实战【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference这是一份面向 C 开发者的高密度速查指南源自本仓库 docs/cpp.md 备忘清单覆盖从 hello world、变量与数据类型、条件与循环到函数重载、Lambda 表达式、智能指针、多线程并发与预处理器指令的完整知识骨架。读完本文你将获得一套可直接复制的代码片段与参数速查表能够在编写、编译g和调试 C 程序时快速定位关键语法与标准库用法。入门从编译运行到基础语法hello.cpp第一个程序任何 C 程序都从一个入口函数开始。下面的最小程序演示了头文件引入、标准输出流与返回码的完整结构#include iostream int main() { std::cout Hello Quick Reference\n; return 0; }使用 GCC 工具链编译并运行$ g hello.cpp -o hello $ ./hello Hello Quick Reference要点g是 GNU 的 C 编译器-o hello指定输出可执行文件名\n是换行转义序列。若需要启用 C11 及以上标准可追加-stdc11多线程示例中尤为关键。变量与常量int number 5; // 整数 float f 0.95; // 浮点数 double PI 3.14159; // 浮点数 char yes Y; // 字符 std::string s ME; // 字符串文本 bool isRight true; // 布尔值 // 常量 const float RATE 0.8;自 C11 起支持花括号初始化列表初始化编译器可借此进行窄化转换检查int age {25}; // 自 C11 std::cout age; // 打印 25原始数据类型速查表| 数据类型 | 大小 | 范围 | | :- | -- | -- | |int| 4 bytes | -2³¹ 到 2³¹-1 | |float| 4 bytes |N/A| |double| 8 bytes |N/A| |char| 1 byte | -128 到 127 | |bool| 1 byte |true/false| |void|N/A|N/A| |wchar_t| 2 到 4 bytes | 1 个宽字符 |注意表中的字节数与范围依赖具体平台常见于 32/64 位 x86 与 ARM 环境int在多数桌面平台为 4 字节。跨平台编程时可用sizeof(int)运行时确认。用户输入std::cin从标准输入读取配合提取运算符int num; std::cout Type a number: ; std::cin num; std::cout You entered num;交换两个值标准库std::swap是首选方案int a 5, b 10; std::swap(a, b); // 输出: a10, b5 std::cout a a , b b;位运算异或技巧可以做到无临时变量交换仅对整数// 整数交换的奇技淫巧 (x ^ y), (y ^ x), (x ^ y); // 注意 以下操作会造成 undefined behavior x ^ y ^ x ^ y;务必警惕x ^ y ^ x ^ y;这种链式写法在 C 中属于未定义行为在同一表达式内多次写同一对象应永远避免。注释// C中的单行注释 /* 这是一个多行注释 在 C 中 */命名空间命名空间用于组织全局标识符避免名字冲突。显式限定写法#include iostream namespace ns1 {int val(){return 5;}} int main() { std::cout ns1::val(); }using声明后可直接使用#include iostream namespace ns1 {int val(){return 5;}} using namespace ns1; using namespace std; int main() { cout val(); }注意大型项目中应谨慎使用using namespace它可能引入命名冲突更推荐限定名或按需using ns1::val;。引用引用是已存在变量的别名ri和i指向相同的内存位置int i 1; int ri i; // ri 是对 i 的引用 ri 2; // i 现在改为 2 std::cout i i; i 3; // i 现在改为 3 std::cout ri ri;函数的三段式声明、调用、定义#include iostream void hello(); // 声明 int main() { // 主函数 hello(); // 执行函数 } void hello() { // 定义 std::cout Hello Quick Reference!\n; }C 数组定义、操控与多维定义与初始化std::array是 C11 引入的定长数组容器std::arrayint, 3 marks; // 定义 marks[0] 92; marks[1] 97; marks[2] 98; // 定义和初始化 std::arrayint, 3 marks {92, 97, 98}; // 有空成员 std::arrayint, 3 marks {92, 97}; std::cout marks[2]; // 输出: 0要点值初始化后未显式指定的成员被零初始化因此上例第三个元素输出 0。操控元素┌─────┬─────┬─────┬─────┬─────┬─────┐ | 92 | 97 | 98 | 99 | 98 | 94 | └─────┴─────┴─────┴─────┴─────┴─────┘ 0 1 2 3 4 5std::arrayint, 6 marks { 92, 97, 98, 99, 98, 94 }; // 打印第一个元素 std::cout marks[0]; // 将第 2 个元素更改为 99 marks[1] 99; // 从用户那里获取输入 std::cin marks[2];数组下标从 0 开始通过marks[i]既可读取也可写入包括接收std::cin输入。展示基于范围的 for 与传统 forchar ref[5] {R, e, f}; // 基于范围的for循环 for (const int n : ref) { std::cout std::string(1, n); } // 传统的for循环 for (int i 0; i sizeof(ref); i) { std::cout ref[i]; }两种方式输出结果相同基于范围的for更简洁、不易越界。多维数组j0 j1 j2 j3 j4 j5 ┌────┬────┬────┬────┬────┬────┐ i0 | 1 | 2 | 3 | 4 | 5 | 6 | ├────┼────┼────┼────┼────┼────┤ i1 | 6 | 5 | 4 | 3 | 2 | 1 | └────┴────┴────┴────┴────┴────┘int x[2][6] { {1,2,3,4,5,6}, {6,5,4,3,2,1} }; for (int i 0; i 2; i) { for (int j 0; j 6; j) { std::cout x[i][j] ; } } // 输出: 1 2 3 4 5 6 6 5 4 3 2 1C 条件if / else if / switch 与运算符if 与 elseif (a 10) { // do something }int number 16; if (number % 2 0) { std::cout even; } else { std::cout odd; } // 输出: evenelse if 链int score 99; if (score 100) { std::cout Superb; } else if (score 90) { std::cout Excellent; } else if (score 80) { std::cout Very Good; } else if (score 70) { std::cout Good; } else if (score 60) std::cout OK; else std::cout What?;注意最后一个else if (score 60)之后直接跟语句而不加花括号是合法的但可读性较差正式代码建议始终使用花括号。运算符速查表关系运算符| 运算符 | 含义 | | :-- | -- | |a b| a 等于 b | |a ! b| a 不等于 b | |a b| a 小于 b | |a b| a 大于 b | |a b| a 小于或等于 b | |a b| a 大于或等于 b |赋值运算符| 范例 | 相当于 | | :-- | -- | |a b|Akaa a b| |a - b|Akaa a - b| |a * b|Akaa a * b| |a / b|Akaa a / b| |a % b|Akaa a % b|逻辑运算符| Example | Meaning | | -- | -- | |exp1 exp2| Both are true(AND)| |exp1 \|\| exp2| Either is true(OR)| |!exp|expis false(NOT)|位运算符| 运算符 | 描述 | | -- | -- | |a b| 按位与 | |a \| b| 按位或 | |a ^ b| 按位异或 | |~a| 按位取反 | |a b| 左移 | |a b| 右移 |三元运算符┌── True ──┐ Result Condition ? Exp1 : Exp2; └───── False ─────┘int x 3, y 5, max; max (x y) ? x : y; // 输出: 5 std::cout max std::endl;等价于 if/else 写法int x 3, y 5, max; if (x y) { max x; } else { max y; } // 输出: 5 std::cout max std::endl;switch 语句int num 2; switch (num) { case 0: std::cout Zero; break; case 1: std::cout One; break; case 2: std::cout Two; break; case 3: std::cout Three; break; default: std::cout What?; break; }每个case末尾的break用于跳出 switch防止“穿透”fall-through到下一个分支default处理所有未匹配值。C 循环while、for、范围 for 与流程控制whileint i 0; while (i 6) { std::cout i; } // 输出: 012345do-whiledo-while保证循环体至少执行一次int i 1; do { std::cout i; } while (i 5); // 输出: 12345continue 语句跳过本次迭代的剩余部分for (int i 0; i 10; i) { if (i % 2 0) { continue; } std::cout i; } // 输出: 13579无限循环的三种写法while (true) { // true or 1 std::cout 无限循环; }for (;;) { std::cout 无限循环; }for(int i 1; i 0; i) { std::cout infinite loop; }第三种写法依赖int溢出回绕属于技巧性写法实际项目中建议使用前两种。for_eachC11 起std::for_each对区间内每个元素应用可调用对象#include iostream int main() { auto print [](int num) { std::cout num std::endl; }; std::arrayint, 4 arr {1, 2, 3, 4}; std::for_each(arr.begin(), arr.end(), print); return 0; }基于范围的 for 循环C11 起对初始化列表for (int n : {1, 2, 3, 4, 5}) { std::cout n ; } // 输出: 1 2 3 4 5对字符串std::string hello Quick Reference.ME; for (char c: hello) { std::cout c ; } // 输出: Q u i c k R e f . M Ebreak 中断语句int password, times 0; while (password ! 1234) { if (times 3) { std::cout Locked!\n; break; } std::cout Password: ; std::cin password; // input }多变量循环for (int i 0, j 2; i 3; i, j--){ std::cout i i ,; std::cout j j ;; } // 输出: i0,j2;i1,j1;i2,j0;auto 推导auto让编译器推导变量类型在范围 for 中尤为常用std:: string s hello world; for(auto c: s){ std:: cout c ; } // 输出: h e l l o w o r l dC 函数参数、重载、内置函数与 Lambda参数与返回值#include iostream int add(int a, int b) { return a b; } int main() { std::cout add(10, 20); }add是一个接受 2 个整数并返回整数的函数。函数重载同名函数依据参数列表类型与个数区分void fun(string a, string b) { std::cout a b; } void fun(string a) { std::cout a; } void fun(int a) { std::cout a; }重载决议发生在编译期调用时由实参类型决定使用哪个版本。内置函数标准库#include iostream #include cmath // 导入库 int main() { // sqrt() 来自 cmath std::cout sqrt(9); }除cmath外字符串、容器、算法等能力分散在string、vector、algorithm、memory、thread、future等标准库头文件中后续章节将逐一用到。Lambda 表达式Lambda 表达式可以在函数内定义可以理解为在函数内定义的临时函数。格式auto func []() - return_type { };各部分含义[]为捕获列表能够捕获其所在函数的局部变量一个空的捕获列表代表 Lambda 表达式不捕获任何的变量对于值捕获直接在中括号中填写要捕获的变量即可int val 5; auto func [val]() - return_type { };对于引用捕获需要在捕获的变量前添加string str(hello world!); auto func [str]() - return_type { };如果变量太多需要编译器根据我们编写的代码自动捕获可以采用隐式捕获的方式全部值捕获int val1, val2; auto func []() - int { return val1 val2; };全部引用捕获string str1(hello), str2(word!); auto func []() - string { return str1 str2; };混合隐式捕获如果希望对一部分变量采用值捕获对其他变量采用引用捕获可以混合使用int val1 123, val2 456; string str1(123), str2(456); auto func1 [, str1]() - int { return val1 std::stoi(str1) ? val1 : val2; }; auto func2 [, val1]() - string { return str1 std::to_string(val1) ? str1 : str2; };()是参数列表只需按照普通函数的使用方法使用即可return_type是函数的返回类型- return_type可以不写编译器会自动推导{}中的内容就是函数体依照普通函数的使用方法使用即可以下是一个 Lambda 的实际使用例子此处也可以使用std::copy完成同样的输出// vec中包含1, 2, 3, 4, 5 std::vectorint vec({1, 2, 3, 4, 5}); std::for_each(vec.begin(), vec.end(), [](int ele) - void { std::cout ele ; });C 智能指针智能指针基础智能指针位于memory头文件用于自动管理动态内存的生命周期#include memory // 创建独占所有权的指针 std::unique_ptrint p1 std::make_uniqueint(42); // 不能复制只能移动 std::unique_ptrint p2 std::move(p1); // p1 现在为 nullptr // 创建共享所有权的指针 std::shared_ptrint sp1 std::make_sharedint(42); // 可以复制引用计数增加 std::shared_ptrint sp2 sp1; // 获取引用计数 std::cout sp1.use_count(); // 输出: 2 // 创建弱引用不增加引用计数 std::weak_ptrint wp sp1;三种指针的定位unique_ptr独占所有权shared_ptr共享所有权引用计数weak_ptr是观察者不参与所有权用于打破循环引用。unique_ptr// 创建方式1使用 make_unique (C14) auto p1 std::make_uniqueint(42); // 创建方式2直接构造 std::unique_ptrint p2(new int(42)); // 访问资源 std::cout *p1 std::endl; *p1 100; // 获取原始指针不转移所有权 int* raw p1.get(); // 释放所有权并返回原始指针 int* released p1.release(); // p1 现在为 nullptr // 替换管理的对象 p1.reset(new int(50));要点make_unique需要 C14get()只是借用裸指针release()才移交所有权此后需手动deletereset()则直接替换所管理的对象。shared_ptr// 创建方式1使用 make_shared auto sp1 std::make_sharedint(42); // 创建方式2直接构造 std::shared_ptrint sp2(new int(42)); // 复制和共享所有权 std::shared_ptrint sp3 sp1; std::cout sp1.use_count(); // 输出: 2 // 访问资源 std::cout *sp1 std::endl; *p1 100; // 所有指向该资源的shared_ptr都会看到这个修改 *sp1 100; // 所有指向该资源的shared_ptr都会看到这个修改 // 重置指针 sp1.reset(); // sp1变为nullptr引用计数减1注示例中原*p1 100;一行中的p1应为sp1这里已修正为*sp1 100;。引用计数降为 0 时最后一个shared_ptr析构会释放底层对象。weak_ptrstd::shared_ptrint sp std::make_sharedint(42); std::weak_ptrint wp sp; // 检查引用对象是否存在 if (auto locked wp.lock()) { std::cout *locked std::endl; // 输出: 42 } else { std::cout 对象已被销毁 std::endl; } // 检查是否过期 bool is_expired wp.expired(); // false // 获取引用计数 std::cout wp.use_count(); // 输出: 1 // 当所有shared_ptr都被销毁时 sp.reset(); if (wp.expired()) { std::cout 对象已被销毁 std::endl; }weak_ptr不增加引用计数因此use_count()仍为 1访问对象前用lock()获得临时shared_ptr是安全模式。循环引用问题两个对象互相持有shared_ptr会导致引用计数永远无法归零造成内存泄漏。解决手段是把其中一个方向改为weak_ptrstruct Node { std::string name; std::shared_ptrNode next; // 使用weak_ptr避免循环引用 std::weak_ptrNode parent; Node(const std::string n) : name(n) {} ~Node() { std::cout 销毁: name std::endl; } }; // 创建循环引用 void createCycle() { auto node1 std::make_sharedNode(Node1); auto node2 std::make_sharedNode(Node2); node1-next node2; node2-parent node1; // 使用weak_ptr避免循环引用 // 函数结束时node1和node2会被正确销毁 // 如果parent也是shared_ptr则会造成内存泄漏 }运行createCycle()时两个节点的析构函数都会打印“销毁”信息——这正是weak_ptr打破循环引用的直观验证。C 多线程多线程示例需要以-stdc11编译并包含以下头文件#include threadC 多线程库#include mutexC 互斥量库#include futureC 异步库线程的创建以普通函数作为线程入口函数void entry_1() { } void entry_2(int val) { } std::thread my_thread_1(entry_1); std::thread my_thread_2(entry_2, 5);以类对象作为线程入口函数class Entry { void operator()() { } void entry_function() { } }; Entry entry; // 调用operator()() std::thread my_thread_1(entry); // 调用Entry::entry_function std::thread my_thread_2(Entry::entry_function, entry);以 lambda 表达式作为线程入口函数std::thread my_thread([]() - void { // ... });线程的销毁thread my_thread; // 阻塞 my_thread.join(); // 非阻塞 my_thread.detach();join()阻塞当前线程直至子线程结束detach()让线程在后台运行并与std::thread对象脱离关联。析构时若线程仍可 join 而未 join会触发std::terminate因此二者必选其一。this_thread 命名空间// 获取当前线程ID std::this_thread::get_id(); // 使当前线程休眠一段指定时间 std::this_thread::sleep_for(); // 使当前线程休眠到指定时间 std::this_thread::sleep_until(); // 暂停当前线程的执行让别的线程执行 std::this_thread::yield();锁互斥量#include mutex锁的基本操作创建锁std::mutex m;上锁 / 解锁m.lock(); m.unlock();尝试上锁成功返回true失败返回falsem.try_lock(); m.unlock();手动lock()/unlock()需要程序员保证每条路径上都成对出现容易出错RAII 锁封装更安全。更简单的锁 ——std::lock_guardMutex构造时上锁析构时解锁std::mutex m; std::lock_guardstd::mutex lock(m);额外参数std::adopt_lock只需解锁无需上锁适用于已手动上锁的场景// 手动上锁 m.lock(); std::lock_guardmutex lock(m, std::adopt_lock);unique_lockMutex构造上锁析构解锁相比lock_guard更灵活支持延迟上锁、尝试上锁与手动解锁std::mutex m; std::unique_lockmutex lock(m);std::adopt_lock只需解锁无需上锁// 手动上锁 m.lock(); std::unique_lockmutex lock(m, std::adopt_lock);std::try_to_lock尝试上锁可以通过std::unique_lockMutex::owns_lock()查看状态std::unique_lockmutex lock(m, std::try_to_lock); if (lock.owns_lock()) { // 拿到了锁 } else { // 没有 }std::defer_lock绑定锁但不上锁后续手动控制std::unique_lockmutex lock(m, std::defer_lock); lock.lock(); lock.unlock();std::unique_lockMutex::release返回所管理的mutex对象指针释放所有权。一旦释放了所有权那么如果原来互斥量处于互斥状态程序员有责任手动解锁。std::call_once当多个线程通过这个函数调用一个可调用对象时只会有一个线程成功调用常用于线程安全的单例初始化std::once_flag flag; void foo() { } std::call_once(flag, foo);std::condition_variable条件变量创建条件变量std::condition_variable cond;等待条件变量被通知std::unique_lockstd::mutex lock; extern bool predicate(); // 调用方式 1 cond.wait(lock); // 调用方式 2 cond.wait(lock, predicate);wait的语义wait不断地尝试重新获取并加锁该互斥量如果获取不到它就卡在这里并反复尝试重新获取如果获取到了执行流程就继续往下走wait在获取到互斥量并加锁了互斥量之后如果wait被提供了可调用对象那么就执行这个可调用对象如果返回值为false那么wait继续加锁直到再次被 notified如果返回值为true那么wait返回继续执行流程如果wait没有第二个参数那么直接返回继续执行std::condition_variable::notify_onenotify_one唤醒一个调用wait的线程。注意在唤醒之前要解锁否则调用wait的线程也会因为无法加锁而阻塞。std::condition_variable::notify_all唤醒所有调用wait的线程。获取线程的运行结果future / async#include future创建异步任务double func(int val); // 使用std::async创建异步任务 // 使用std::future获取结果 // future模板中存放返回值类型 std::futuredouble result std::async(func, 5);获取异步任务的返回值等待异步任务结束但是不获取返回值result.wait();获取异步任务的返回值int val result.get();注get()返回右值因此只可调用一次只要调用上述任意函数线程就会一直阻塞到返回值可用入口函数运行结束std::async的额外参数额外参数可以被放在std::async的第一个参数位置用于设定std::async的行为std::launch::deferred入口函数的运行会被推迟到std::futureT::get()或者std::futureT::wait()被调用时。此时调用线程会直接运行线程入口函数换言之不会创建子线程std::launch::async立即创建子线程并运行线程入口函数std::launch::deferred | std::launch::async默认值由系统自行决定返回值的状态让当前线程等待一段时间等待到指定时间点以期待返回值准备好extern double foo(int val) {} std::futuredouble result std::async(foo, 5); //返回值类型 std::future_status status; // 等待一段时间 status result.wait_for( std::chrono::seconds(1) ); // 等待到某一时间点 status result.wait_until( std::chrono::now() std::chrono::seconds(1) );在指定的时间过去后可以获取等待的结果// 返回值已经准备好 if (status std::future_status::ready) { } // 超时尚未准备好 else if (status std::future_status::timeout) { } // 尚未启动: std::launch::deferred else if (status std::future_status::deferred) { }多个返回值如果要多次获取结果可以使用std::shared_future其会返回结果的一个拷贝std::shared_futureT result;对于不可拷贝对象可以在std::shared_future中存储对象的指针而非对象本身。综合示例创建线程并传参创建线程并等待执行完毕void threadFunction() { // 线程函数体 std::cout From thread std::endl; } int main() { // 创建线程并开始执行线程函数 std::thread t(threadFunction); // 等待线程执行完毕 t.join(); return 0; }传递参数给线程函数void threadFunction(int value) { // 线程函数体 std::cout Received value: value std::endl; } int main() { int data 42; std::thread t(threadFunction, data); t.join(); return 0; }使用 Lambda 表达式创建线程int main() { int data 42; std::thread t([data]() { // Lambda 表达式作为线程函数 std::cout Received value: data std::endl; }); t.join(); return 0; }综合示例处理线程间的同步多个线程同时输出时用互斥量保护共享输出流#include mutex std::mutex mtx; void threadFunction() { std::lock_guardstd::mutex lock(mtx); std::cout Thread safe output. std::endl; } int main() { std::thread t1(threadFunction); std::thread t2(threadFunction); t1.join(); t2.join(); return 0; }综合示例使用std::async启动异步任务#include future int taskFunction() { // 异步任务 return 42; } int main() { // 启动异步任务 std::futureint fut std::async(std::launch::async, taskFunction); // 获取异步任务的结果 int result fut.get(); std::cout Result: result std::endl; return 0; }C 预处理器预处理器在编译之前对源码进行文本层面的处理指令以#开头。Includes#include iostream #include iostream#include ...用于在标准包含路径中查找头文件#include ...优先在当前目录查找找不到再退回标准路径。Defines#define FOO #define FOO hello #undef FOO#define定义宏可带值#undef取消宏定义。If 条件编译#ifdef DEBUG std::cout hi std::endl; #elif defined VERBOSE ... #else ... #endif#ifdef/#ifndef/#elif/#else/#endif构成条件编译常用于按构建配置切换代码。Error#if VERSION 2.0 #error Unsupported #warning Not really supported #endif#error使编译直接失败并输出信息#warning仅输出警告。宏#define DEG(x) ((x) * 57.29)带参数的宏务必为每个参数加括号避免运算符优先级陷阱。令牌连接###define DST(name) name##_s name##_t DST(object); # object_s object_t;##将左右令牌拼接成一个新令牌。字符串化##define STR(name) #name char * a STR(object); # char * a object;#将参数转换为字符串字面量。文件和行#define LOG(msg) console.log(__FILE__, __LINE__, msg) # console.log(file.txt, 3, hey)__FILE__与__LINE__是预定义宏分别展开为当前文件名与行号常用于日志与断言。实用速查转义序列与关键字转义序列| 转义序列 | 说明 | | :-- | -- | |\b| 退格键 | |\f| 换页 | |\n| 换行 | |\r| 返回 | |\t| 水平制表符 | |\v| 垂直制表符 | |\\| 反斜杠 | |\| 单引号 | |\| 双引号 | |\?| 问号 | |\0| 空字符 |关键字总览C 关键字众多下面是按功能归类的速查清单完整列表可查阅语言规范与 cppreference类型相关bool、char、char8_t、char16_t、char32_t、wchar_t、int、float、double、short、long、signed、unsigned、void、auto、decltype存储与限定const、constexpr、consteval、constinit、mutable、static、extern、register、thread_local、volatile控制流if、else、switch、case、default、break、continue、return、goto、while、do、for面向对象class、struct、union、enum、public、private、protected、virtual、override、final、friend、explicit、this模板与泛型template、typename、concept、requires类型转换static_cast、dynamic_cast、const_cast、reinterpret_cast、typeid异常try、catch、throw、noexcept运算符替代拼写and、and_eq、or、or_eq、not、not_eq、xor、xor_eq、bitand、bitor、compl内存与对象new、delete、sizeof、alignas、alignof、nullptr、operator模块与协程export、import、module、co_await、co_return、co_yield其他asm、static_assert、typedef、using、namespace、inline、lambda相关default/delete用于特殊成员函数、reflexpr、synchronized、transaction_safe、transaction_safe_dynamic、atomic_cancel、atomic_commit、atomic_noexcept在 Quick Reference 仓库中继续深入本文是 docs/cpp.md 备忘清单的展开版原文档以卡片式速查布局呈现适合打印与离线查阅C 的现代构建通常由 CMake 驱动本仓库提供了完整的 CMake 备忘清单覆盖cmake_minimum_required、target_sources、target_compile_features如cxx_std_17等与 C 工程强相关的配置写法需要对照 C 语言基础语法时可参考姊妹篇 C 语言备忘清单仓库 assets/ 目录提供了cpp.svg、cmake.svg等语言与工具图标README.md中亦将 C 列于编程语言分区可从 README.md 直接跳转到 C 条目。结语本备忘清单从g hello.cpp出发沿语法基础 → 数组 → 条件 → 循环 → 函数与 Lambda → 智能指针 → 多线程并发 → 预处理器的路径完整覆盖了 C 开发中最高频的知识点。智能指针章节的unique_ptr/shared_ptr/weak_ptr与循环引用案例以及多线程章节的锁、条件变量和 future/async 组合是实际工程中最常被反复查阅的部分。建议将本文与 docs/cpp.md 配合使用速查时看原文卡片需要理解原理时回到本文的说明段落。【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →