大多数签名/未签名警告的可接受修复?

2023-11-23

我本人确信,在我正在研究的项目中,有符号整数在大多数情况下是最佳选择,即使其中包含的值永远不会是负数。 (更简单的反向 for 循环,更少的错误机会等,特别是对于只能保存 0 到 20 之间的值的整数。)

大多数出错的地方是 std::vector 的简单迭代,通常过去它是一个数组,后来已更改为 std::vector 。所以这些循环通常看起来像这样:

for (int i = 0; i < someVector.size(); ++i) { /* do stuff */ }

由于此模式使用得非常频繁,因此有关有符号和无符号类型之间的这种比较的编译器警告垃圾邮件的数量往往会隐藏更有用的警告。请注意,我们绝对没有超过 INT_MAX 元素的向量,并请注意,到目前为止我们使用两种方法来修复编译器警告:

for (unsigned i = 0; i < someVector.size(); ++i) { /*do stuff*/ }

这通常有效,但如果循环包含“if (i-1 >= 0) ...”等任何代码,则可能会默默地中断。

for (int i = 0; i < static_cast<int>(someVector.size()); ++i) { /*do stuff*/ }

此更改没有任何副作用,但确实使循环的可读性大大降低。 (而且打字更多。)

所以我想出了以下想法:

template <typename T> struct vector : public std::vector<T>
{
    typedef std::vector<T> base;

    int size() const     { return base::size(); }
    int max_size() const { return base::max_size(); }
    int capacity() const { return base::capacity(); }

    vector()                  : base() {}
    vector(int n)             : base(n) {}
    vector(int n, const T& t) : base(n, t) {}
    vector(const base& other) : base(other) {}
};

template <typename Key, typename Data> struct map : public std::map<Key, Data>
{
    typedef std::map<Key, Data> base;
    typedef typename base::key_compare key_compare;

    int size() const     { return base::size(); }
    int max_size() const { return base::max_size(); }

    int erase(const Key& k) { return base::erase(k); }
    int count(const Key& k) { return base::count(k); }

    map() : base() {}
    map(const key_compare& comp) : base(comp) {}
    template <class InputIterator> map(InputIterator f, InputIterator l) : base(f, l) {}
    template <class InputIterator> map(InputIterator f, InputIterator l, const key_compare& comp) : base(f, l, comp) {}
    map(const base& other) : base(other) {}
};

// TODO: similar code for other container types

您所看到的基本上是 STL 类,其返回 size_type 的方法被重写以仅返回“int”。需要构造函数,因为它们不是继承的。

如果您在现有代码库中看到这样的解决方案,作为开发人员您会怎么看?

您是否会认为“哇,他们正在重新定义 STL,这真是太棒了!”,还是您会认为这是一个很好的简单解决方案,可以防止错误并提高可读性。或者也许您更愿意看到我们花了(半)天左右的时间来更改所有这些循环以使用 std::vector::iterator?

(特别是如果该解决方案与禁止对除原始数据(例如无符号字符)和位掩码之外的任何内容使用无符号类型相结合。)


不要从 STL 容器公开派生。它们具有非虚拟析构函数,如果有人通过指向基的指针删除您的对象之一,则会调用未定义的行为。如果你必须导出例如从向量中,私下进行并公开您需要公开的部分using声明。

在这里,我只想使用size_t作为循环变量。它简单易读。评论者使用int索引让您知道 n00b 是正确的。然而,使用迭代器循环向量会让你成为一个稍微更有经验的 n00b - 一个没有意识到向量的下标运算符是常数时间的人。 (vector<T>::size_type是准确的,但在我看来是不必要的冗长)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大多数签名/未签名警告的可接受修复? 的相关文章

  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working
  • 如何使用实体框架设置连接字符串

    我将 EF6 与 MySQL 结合使用 并有一个用于多个数据库的模型 我希望能够在我的表单中设置连接设置 如何以编程方式设置模型的连接字符串 你应该使用EntityConnectionFactory这就是您所需要的 public strin
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas

随机推荐

  • roslyn 编译器未使用 msbuild 复制到 AspnetCompileMerge 文件夹

    我有一个 NET MVC 项目 我正在尝试使用 Jenkins 进行部署 我一直让 Jenkins 运行 msbuild 然后使用 RoboCopy 复制生成的文件 我想切换为仅使用发布配置文件 发布配置文件在使用 Visual Studi
  • 根据内容调整 RichTextBox 的大小

    此代码根据 RichTextBox 的内容自动调整其大小 我遇到了问题 尤其是表格 t可能会被忽略 我尝试了托管解决方案 现在我正在尝试平台调用 电流输出 DllImport gdi32 dll static extern bool Get
  • 在 VueJS 中配置 Get、Post、Patch 全局标头的最佳方法

    我是 VueJs 的新手 我正在寻找在 VueJS 中为 Get Post Patch 配置全局标头的最佳方法 即使用方便 安全性强 目前我只是把它写在export default 对于每个组件 我知道这非常糟糕 所以我请求你们帮忙 感谢
  • 如何使用LDAP对用户进行密码验证?

    我正在编写一个客户端应用程序 使用OpenLDAP库 用户通过 LDAP 服务器进行身份验证 以下是无法比较用户的 userPassword 的硬编码示例程序 include
  • 页面加载后删除 div 时发生 jQuery 冲突

    我正在尝试从页面中删除一个div 最好完全阻止它加载 但现在我决定在页面加载后将其删除 当我尝试以下代码行时在jsFiddle中 the content正如预期的那样 div 被删除 但是 我也尝试过实施它一个实际的网站 但在这种情况下 c
  • Camera.getPicture 不是 ionic 3 中的函数

    我正在使用相机插件单击离子应用程序中的图片 但出现以下错误 OrdercancelPage html 24 ERROR TypeError Object is not a function at Camera getPicture inde
  • Unity构造函数注入其他参数

    我有一个带有构造函数的类 如下所示 public BatchService IRepository repository ILogger logger string user 在我的 DI 引导程序类中 我有以下内容RegisterType
  • 切换 python 打印的最佳方法是什么?

    我在游戏引擎中运行 Python 2 4 并且希望能够在需要时关闭所有打印 例如 我希望在调试版本中打开打印 然后在发布版本中关闭打印 它还必须尽可能透明 我在引擎的 C 代码中对此的解决方案是printf里面的函数vararg宏 并将其定
  • 从 Google Places API (Swift 3) 获取附近地点的列表

    我知道已经存在类似的威胁 但是exact我正在寻找的主题似乎没有被触及 我是一个编程新手 但是 我成功地运行了一个应用程序 它可以获取您当前的位置 将坐标转换为地址 并能够将您的位置数据存储在 tableView 中 现在我正在寻找一种方法
  • Html 锚标记 onclick() 和 href 同时执行

    如同HTML 锚链接 href 和 onclick 两者 帖子 我的是 a href tmp download mp3 Download link a The update 方法将向服务器发送另一个 HTTP GET 方法来更新已下载的文件
  • MATLAB 是否优化 diag(A*B)?

    假设我有两个非常大的矩阵A M N 和B N M 我需要的对角线A B 计算完整的A B需要 M M N 次乘法 而计算它的对角线只需要 M N 次乘法 因为不需要计算最终位于对角线之外的元素 MATLAB 是否实现了这一点并进行即时优化d
  • 如何更改log4j中的htmllayout

    我想更改Java中log4j的htmllayout 5列 时间 线程 级别 类别 消息 我的 log4j properties 是 log4j rootLogger DEBUG Console File log4j appender Con
  • org.apache.catalina.LifecycleException:子容器在启动期间失败

    SEVERE A child container failed during start java util concurrent ExecutionException org apache catalina LifecycleExcept
  • Spring - 无法解析 MVC“视图”thymeleaf

    我有一个简单的HomeController class package com example tacos import org springframework stereotype Controller import org spring
  • 获取 C 时区的夏令时转换日期

    在 C 中 是否有一种简单的跨平台方法来检索给定时区开始和结束夏令时的日期 我已经有了时区偏移信息以及当前是否正在观察夏令时 但我确实需要夏令时开始和结束的日期 对于我无法控制的外部依赖项 在 Windows 中 我正在使用获取时区信息 t
  • 在构造函数内分配原型

    我有这个代码 var MyClass function b this a b this getA function return that a var SecondClass function b this prototype new My
  • Multer 不接受数组格式的文件会出现“意外文件错误”

    Multer是与node js和express一起使用的用于上传文件的模块 我在角度方面使用 ng file upload 模块 当我一一发送多个文件时 它工作得很好 没有任何错误 但是当我以数组格式一次性发送所有文件 然后按照 Multe
  • Android ndk(cmake):在第二个 jni 库中使用日志 api 时,“未定义引用‘__android_log_write’”

    我使用 Android Studio 2 2 和 cmake 来构建 jni 文件 我想在 jni 文件中显示日志 但收到错误消息 未定义对 android log write 的引用 我的 CMakeLists txt 文件是 add l
  • CFG 的扩展,它是什么?

    考虑以下上下文无关语法的扩展 它允许规则在左侧有一个 或多个 终端在非终端的右侧 即 形式规则 A b gt 右侧可以是任何东西 就像在上下文无关语法中一样 特别是 它是not要求右侧末尾具有完全相同的终端符号 在这种情况下 此扩展将是上下
  • 大多数签名/未签名警告的可接受修复?

    我本人确信 在我正在研究的项目中 有符号整数在大多数情况下是最佳选择 即使其中包含的值永远不会是负数 更简单的反向 for 循环 更少的错误机会等 特别是对于只能保存 0 到 20 之间的值的整数 大多数出错的地方是 std vector