C和C++中常见的一个错误源是如下代码: size_t n = // ... for (unsigned int i = 0; i < n; i++) // ... 当unsigned int溢出时,循环可能会无限循环。 例如,在Linux中,unsigned int是32位,而size_t是64位,因此如果n = 5000000000,将会导致无限循环。 我该如何在使用GCC或Clang时收到有关此问题的警告? GCC的-Wall和-Wextra并不会发出警告: #include <stdint.h>…

2023年 8月 20日 0条评论 110点热度 0人点赞 admin 阅读全文

以下的 C++ 代码会先打印 11.1,然后导致崩溃。Lambda 函数在构造函数内部似乎被正确调用,但在稍后,同样的函数不再起作用!为什么会这样?Lambda 函数是否有有限的生命周期? #include <functional> #include <iostream> class LambdaStore { public: LambdaStore(const std::function<void(float)>& _fn) : fn(_fn) { fn(11.1f);…

2023年 8月 20日 0条评论 76点热度 0人点赞 admin 阅读全文

我准备将很多旧的C++代码转换为更现代的C++。 代码中有许多像这样的原始二维数组: Foo bar[XSIZE][YSIZE]; 我打算将这些声明替换为: std::array<std::array<Foo, YSIZE>, XSIZE> bar; 这是一种方便的方式,因为语句保持不变,代码应该与使用原始数组时的行为相同,而且还能够在调试构建中进行越界检查。 但是在我看来,std::array<std::array<Foo, YSIZE>> 有些繁琐,不易阅读,而且…

2023年 8月 20日 0条评论 101点热度 1人点赞 admin 阅读全文