在 C API 中使用可变参数来设置键值对是个好主意吗?

2024-01-20

我正在编写一个 API,它可以更新结构中的许多不同字段。

我可以通过使更新函数可变参数来帮助添加未来的字段:

update(FIELD_NAME1, 10, FIELD_NAME2, 20);

然后稍后添加FIELD_NAME3无需更改任何现有调用:

update(FIELD_NAME1, 10, FIELD_NAME2, 20, FIELD_NAME3, 30);

请赐教智慧之言?


一般来说,不会。

Varargs 抛出了很多类型安全性 - 你可以传递指针、浮点数等,而不是整数,并且它会毫无问题地编译。滥用可变参数(例如省略参数)可能会因堆栈损坏或读取无效指针而导致奇怪的崩溃。

例如,以下调用将编译并导致崩溃或其他奇怪的行为:

UpdateField(6, "Field1", 7, "Field2", "Foo");

最初的 6 是期望的参数数量。它将字符串指针“Foo”转换为 int 以放入 Field2,并且它将尝试读取和解释两个不存在的其他参数,这可能会因取消引用堆栈噪音而导致崩溃。

我相信 C 中 varargs 的实现是一个错误(考虑到今天的环境 - 它可能在 1972 年是完全有意义的。)实现是你在堆栈上传递一堆值,然后被调用者将在堆栈中拾取参数,基于关于一些初始控制参数的解释。这种类型的实现基本上会让您以一种很难诊断的方式犯错误。 C# 对此的实现(在方法上传递带有属性的对象数组)必须更明智,尽管不能直接映射到 C 语言。

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

在 C API 中使用可变参数来设置键值对是个好主意吗? 的相关文章

随机推荐

  • ASP.NET MVC 4 用户身份验证

    我正在尝试编写一个 Login 方法 对用户进行身份验证并授权他们进入使用 ASP NET MVC 4 开发的网站 问题是 尽管我在 Login 方法内验证用户并重定向到 ViewProfile 操作后调用 FormsAuthenticat
  • 使用 getline 跳过空格

    我正在编写一个程序来制作问题表格 这些问题被保存到一个文件中 我想读取它们并将它们存储在内存中 我为此使用向量 我的问题有以下形式 1 TEXT What is your name 2 CHOICE Are you ready for th
  • jQuery Isotope - 多个过滤器的问题

    我尝试在使用 Isotope js 的类似投资组合的页面中使用多个过滤器 请看一下这个页面 http decart design com avancia wp vi tilbyr http decart design com avancia
  • 为什么不能从一个表中删除引用另一个表

    我一直在寻找答案 但也许我错过了一些东西 我有 2 个表 如下所示 第一个表中的实体是从第二个表中引用的 但是当我尝试从第二个表中删除时 我得到Error foreign key mismatch 有触发器 此处未显示 但它们与DELETE
  • 将文件输入和标准输入传递给 gdb

    所以我想在 gdb 中运行一个程序 并将文件的内容作为参数 然后 当遇到 EOF 时 我希望能够再次输入用户输入 对于终端中的普通程序 我可以使用以下命令执行类似的操作 cat input txt cat program 在 gdb 中 我
  • 在java中从xml解码大型base64:OutOfMemory

    我需要将 xml 文件的 base64 编码元素写入单独的文件中 问题 文件的大小很容易达到 100 MB 我尝试的每个解决方案都以 java lang OutOfMemoryError Java堆空间 结束 问题不在于一般的读取xml或解
  • 如何在我的 Electron 应用程序中隐藏 API 密钥?

    我正在构建一个使用 Google 的 YouTube Data API v3 的 Electron 应用程序 为了访问 API 我决定使用标准 API 密钥 而不是 OAuth 因为我不会访问任何个人数据 但问题是 我无法在我的应用程序中隐
  • React Native Typescript路径别名无法解析模块

    所以基本上 我使用 RN 主页中的命令行创建了 React Native with Typescript npx react native init MyApp template react native template typescri
  • 什么时候应该调用 Fragment 的 onActivityCreated ?

    我在 ViewPager 中有一些片段 并且我找到了片段的onActivityCreated and onCreateView两者都在我预期之前在页面上被调用 例如 当ViewPager从第2页过渡到第3页时 那么第4页的Fragmento
  • IE11无法连接本地IIS,其他浏览器正常

    我正在使用 XIP IO 通配符域访问在本地 IIS 服务器上运行的网站 今天 IE 11 停止访问该网站 而 Chrome 和 Firefox 继续访问 它甚至可以在远程计算机上运行 所以我知道它与我的本地 IE 有关 我检查过没有代理设
  • 如何在r中一次创建数据框(不仅仅是一个)

    这是一个进一步的问题无序组合并将结果存储在 r 的矩阵中 https stackoverflow com questions 53604144 unordered combination and store the result in a
  • 将 Material-UI 的自动完成组件与 Formik 结合使用

    目前正在尝试使用 Material UI自动完成 https material ui com components autocomplete 与 Formik 的组件 到目前为止 诸如文本字段和来自 Material UI 的传统选择之类的
  • URL 重写在 Laravel 应用程序中编译的 CSS 文件中生成错误的 URL

    我尝试在 Laravel 应用程序中编译 Font Awesome SCSS 文件 Font Awesome 随 NPM 安装 编译后的 CSS 存储在 public css 文件夹中 还创建了 public fonts 文件夹 但编译后的
  • 牛顿差分插值法的正确递归python实现,获取递归内的一些返回值

    我用Python编写了一个递归函数来评估一个序列插值法 http en wikipedia org wiki Divided differences Definition 下图对此进行了图形化解释 f x f x and f x0 x1 f
  • C++ 如何传递命令行参数来读取txt文件

    我一直在努力做的是 1 通过命令行参数读取txt文件 2 使用txt文件中的字符串作为main方法 或您需要调用的任何方法 的参数 例如 有两个txt文件 其中一个名为character txt 另一个名为match txt 文件的内容将是
  • 在Android相机上实现连拍模式

    我正在尝试在 Android 相机上实现连拍模式 目前在 ICS 上 我在网上搜索试图找到一些有关此功能的文档并遇到几个问题 需要保存 可能在 asynctask 上 每个捕获的图像值 然后对其进行处理并将其保存在 SD 卡中 在连续模式下
  • 在 C# 中找出确切的文件类型[重复]

    这个问题在这里已经有答案了 如您所知 文件具有扩展名和 MIME 类型 但这两个属性不够智能 无法确定文件的确切类型 例如我有一个 exe文件 我将其重命名为扩展名二 png 因此 如果我尝试以编程方式找出它的类型或 mime 类型 结果将
  • 缩短 Zsh 中的提示

    我在让 zsh 缩短提示符时遇到了很多麻烦 我目前正在使用带有 agnoster 主题和 oh my zsh 包管理器的 zsh 目前 我的提示在工作期间变得非常长 通常约为 110 个字符 占据了我的终端的整个长度 这在美观上不太令人愉悦
  • Slick:有没有办法用正则表达式创建 WHERE 子句?

    我寻找一个相当于 select from users where last name w son 例如 当数据库中有以下名称时 first name last name Tore Isakson John Smith Solveig Lar
  • 在 C API 中使用可变参数来设置键值对是个好主意吗?

    我正在编写一个 API 它可以更新结构中的许多不同字段 我可以通过使更新函数可变参数来帮助添加未来的字段 update FIELD NAME1 10 FIELD NAME2 20 然后稍后添加FIELD NAME3无需更改任何现有调用 up