相同的匿名结构是否兼容?

2023-12-19

考虑这个代码片段:

#include <threads.h>

int thread_start(void *ptr)
{
    struct {
        int a;
        int b;
    } *data = ptr;

    return 0;
}

int main(int argc, char *argv[])
{
    struct {
        int a;
        int b;
    } data;

    thrd_t thread;
    thrd_create(&thread, thread_start, &data);
    thrd_join(thread, NULL);
    return 0;
}

关于铸造void * to struct { int; int } *,假设匿名结构的字段与最初分配的结构的字段相同,这是根据 C 标准明确定义的行为吗?


如果这些结构不在同一文件中,它们将是兼容的。

Had thread_start已在单独编译的 .c 文件中定义(即单独的翻译单位)那么它们就会兼容。具体来说,成员的名称、类型和顺序是相同的,并且它们都具有相同的标签,在本例中没有标签。

Section §6.2.7 ¶1 http://port70.net/%7Ensz/c/c11/n1570.html#6.7.2.1p1 of the C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf列出了这些要求:

两种类型有兼容型如果它们的类型相同。 用于确定两种类型是否相同的附加规则 兼容的类型说明符在 6.7.2 中进行了描述, 6.7.3 中的类型限定符,以及 6.7.6 中的声明符。此外,声明了两个结构体、联合或枚举类型在 单独的翻译单元如果它们的标签和 成员满足以下要求: 如果已声明 一个标签,另一个应使用相同的标签声明。 如果两者都在各自的任何地方完成 翻译单元,则适用以下附加要求: 他们之间应该是一一对应的 成员使得每对对应的成员是 使用兼容类型声明;如果声明了该对中的一个成员 使用对齐说明符,另一个使用 等效对齐说明符;如果这对中的一个成员 用一个名称声明,另一个用相同的名称声明 姓名。对于两个结构体,应在中声明相应的成员 相同的顺序。对于两个结构或联合,对应 位域应具有相同的宽度。对于两个枚举, 相应的成员应具有相同的值。

所以这些结构would如果它们不在同一文件中,则可以兼容。但正因为如此,这些结构不兼容。

§6.7.2.1 ¶8 http://port70.net/%7Ensz/c/c11/n1570.html#6.7.2.1p8 says:

结构或联合说明符中结构声明列表的存在声明了翻译单元内的新类型。

因此,§6.7.2.1 指定了单个翻译单元中发生的情况。当声明位于单独的翻译单元中时,第 6.2.7 节中的规范将覆盖第 6.7.2.1 节中的规范。

NB: It's easy to confuse 6.2.7 and 6.7.2.

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

相同的匿名结构是否兼容? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 如何动态地将分支目标提示到 x64 CPU?

    我想知道如何用 C C 或汇编语言为 x64 处理器编写高效的跳转表 输入是预先已知的 但不可能通过算法来预测 假设我可以在输入流中查看尽可能远的位置 有什么方法可以动态地告诉 CPU 下一个分支将转到哪个地址 本质上 我想以编程方式更新分
  • 没有模板引擎的 Node.js

    我是 Node js 新手 正在尝试学习 据我了解 使用模板引擎 例如 Jade 是很常见的 甚至对于 CSS 例如 Stylus 也是如此 老实说 我见过的所有教程在布局方面都涉及模板引擎 问题是我不想使用模板引擎 因为我认为它不必要地复
  • javascript客户端到Python服务器:获取请求后XMLHttpRequest响应文本为空

    我正在尝试编写一个 chrome 扩展 它能够向 python 服务器脚本发送 接收数据 目前 我正处于 js 脚本发出 GET 请求的阶段 唯一的问题是 responseText 始终为空 即使 python 脚本以文本响应 popup
  • 高质量图像缩放库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 C 中缩放图像 其质量级别与 Photoshop 一样好 有没有任何 C 图像处理库可以完成这项工作 这是一个注释良好的图像操作帮
  • For循环不推断无符号整数[重复]

    这个问题在这里已经有答案了 根据 F 中 for to 循环的 MSDN 文档 标识符的类型是从开始和结束表达式的类型推断出来的 这些表达式的类型必须是 32 位整数 但是 使用下面的代码 我收到以下编译时错误 for bar 0u to
  • 在 php 中使用 jquery 每 5 秒更改图片 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 请帮助我 我是 jQuery 新手 这是我的代码 img src default jpg img src a jpg img src b
  • 避免模​​块名称修改的干净方法?

    我正在使用 Python 的 ctypes 来连接 C 库文件 运行类型基因 http code google com p ctypesgen 创建一个我可以导入的包装模块 例如 api py 许多 C 函数和宏的名称都以双下划线开头 Py
  • 将 Ajax/UI JS 框架(ext、jquery-ui)与 MVC PHP 框架(zend、symfony)结合起来是个好主意吗?

    我意识到这是一个非常普遍的问题 但我想我并不是真的在寻找明确的答案 作为 PHP 框架的新手 我很难理解它 Javascript 框架 尤其是 UI 扩展 似乎有类似 MVC 的方法 将 JS 代码与设计分开 在后端使用额外的 MVC 框架
  • 为什么 std::map 需要一个运算符< 以及如何编写一个

    我正在使用 std map 库 我试图将一堆数据放入地图中 我创建了一个地图来保存日期 time t 和浮点数 但是当我尝试添加它们时 我的编译器告诉我 错误 与 operator 我尝试创建一个重载的 这是我正在运行它的类 class M
  • 对 Material UI Select 组件的更改做出反应测试库

    我正在尝试测试onChange的事件选择组件 https material ui com api select using 反应测试库 https github com kentcdodds react testing library 我使
  • PowerShell:更改文件夹或文件的时间戳(创建日期)

    对于 Windows 10 上的 PowerShell 命令 我遇到了奇怪的行为 要更改文件的创建日期 我使用 Get ChildItem C testFile1 txt CreationTime 01 11 2005 06 00 36 要
  • jQuery/原型冲突

    我正在使用 jQuery hoverIntent js 脚本来构建大型下拉菜单系统 其灵感来自于 Son Tonaka 的大型下拉菜单 w CSS 和 jQuery sohtanaka com web design mega drop do
  • List 抛出 ConcurrentModificationException 但 set 不抛出 ConcurrentModificationException? [复制]

    这个问题在这里已经有答案了 我有以下两个java类 import java util public class ArrayListTest032 public static void main String ar List
  • 防止网页抓取

    我目前是开发一个应用程序的团队的一员 该应用程序包括前端客户端 通过这个客户端 我们发送用户数据 每个用户都有一个用户 ID 客户端通过 RESTful API 与我们的服务器对话 向服务器请求数据 例如 假设我们有一个书籍数据库 用户可以
  • 将部分模式从 sed 传递到 shell

    我有一个文件 其中包含以下格式的行 w1 1 x w2 4 b w3 2 d 该行中的每个单词 标记 例如 w1 1 x 由 3 部分组成 第一个部分显示某个索引 本例中为 w1 第二个是整数 本例中为 1 第三个是一个字符 在本例中为 x
  • 使用背景颜色在 UIDatePicker 上设置角半径

    我有一个UIDatePicker在我看来 并设置了背景颜色UIDatePicker self datePicker backgroundColor UIColor lightTextColor self datePicker layer c
  • php:将 ntlm 凭据转发给curl

    我有一个动态 php 页面 我需要使用 get 参数来调用它 然后我想将生成的 html 放入一个字符串中并稍后使用它 我正在尝试用于 Web 服务的 tonic 框架 所以这类似于PHP 将动态生成 和回显 的 HTML 读取到字符串中
  • PHP 重定向与自定义标头

    我正在编写一个基本的授权系统 但我有点挣扎 涉及两个文件 index php and login php 登录表单非常简单 它在里面index php fieldset class right fieldset
  • 服务器控件如何违反 MVC 设计模式?

    我问的原因是 tvanfosson 对他对另一个问题的回答的 第一个 评论我的问题 https stackoverflow com questions 3689236 what are the key concepts to know wh
  • 相同的匿名结构是否兼容?

    考虑这个代码片段 include