为什么结构/联合兼容性需要标记和名称相等?

2023-11-26

C99标准第6.2.7.1节中有以下语言:

如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构体、联合或枚举类型是兼容的:如果其中一个使用标签进行声明,则另一个应使用相同的标签进行声明。如果两者都是完整类型,则适用以下附加要求:它们的成员之间应存在一一对应关系,使得每对对应的成员都使用兼容的类型进行声明,并且如果相应对中的一个成员使用名称声明,则另一个成员也使用相同的名称声明。对于两个结构体,相应的成员应以相同的顺序声明。对于两个结构或联合,相应的位域应具有相同的宽度。对于两个枚举,对应的成员应具有相同的值。 (强调已添加)

特别是,这条规则使得这两个struct具有相同布局的不兼容,因为它们的标签和成员名称不匹配:

struct x_type {
    int x;
};

struct y_type { // << Different tag
    int y;      // << Different member name
};

很容易理解为什么成员类型及其声明顺序必须相同。然而,尚不清楚为什么标签和成员名称也需要匹配,即使它们不影响二进制布局struct?


您引用的文本不是在谈论布局兼容的类型,而是在谈论的类型相同类型。该规则是 C 如何定义一个类型的两个定义是否是同一类型的有效重新定义。

在你的例子中你是对的x_type and y_type不兼容,因为它们肯定不描述相同的类型!如果它们兼容,则意味着调用void foo(struct x_type*)带有类型参数struct y_type*是有效的,这当然不是本意。

您引用的文本和以下段落是 C++ ODR 的 C 等效项,并且要求标签和成员名称相同类似于 [basic.def.odr] 中的措辞:

给定这样一个名为D在多个翻译单元中定义,然后

— 每个定义D应由相同的令牌序列组成;和
- 在每个定义中D,根据 3.4 查找的相应名称应指代定义中定义的实体D,或应引用同一实体,在重载解析(13.3)之后和部分模板专业化(14.8.3)匹配之后,[...]

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

为什么结构/联合兼容性需要标记和名称相等? 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • UIWebView stringByEvaluatingJavaScriptFromString

    我一直致力于让一些非常基本的 JS 在我的 UIWebView 中运行 在网络视图的委托中 我有 void webViewDidFinishLoad UIWebView wView NSString someHTML wView strin
  • 删除子图

    我正在尝试找出一种删除 动态 matplotlib 中的子图的方法 我看到他们有一个remove方法 但我收到错误 NotImplementedError cannot remove artist 我很惊讶我在任何地方都找不到这个 有谁知道
  • 缩放和平移后如何获得相对于画布的触摸坐标?

    在移动和缩放画布后 我需要获得相对于画布的 x 和 y 触摸 以检查碰撞和类似的情况 每当我平移画布或围绕原点 0 0 缩放画布时 我已经设法通过使用以下代码获取触摸坐标 private float convertToCanvasCoord
  • 为什么 exec("break") 不在 while 循环内工作

    正如问题所问 为什么下面的代码不起作用 while True exec break 我通过 python 3 5 2 控制台在 pycharm 中执行上述内容 我最初认为这是一个上下文问题 但在阅读文档后 我还没有进一步理解为什么会出现此错
  • SQL 查询之间有什么区别?

    我们有这样的查询 SELECT t FROM articles t WHERE t article id 59446 也称为 SELECT articles FROM articles WHERE articles article id 5
  • 您的连接不安全 - 使用 Selenium.WebDriver v.3.6.0 + Firefox v.56

    我正在编写测试硒 C 我面临一个重要问题 因为当我使用安全连接测试我的网站时没有找到解决方案 HTTPS 我在 stackoverflow 上找到的所有解决方案都已过时或不起作用 我尝试练习以下问题的所有解决方案 Selenium 为什么将
  • 如何使用java获取本地系统的子网掩码?

    你如何获得Subnet使用Java的本地系统的掩码地址 本地主机接口的第一个地址的网络掩码 InetAddress localHost Inet4Address getLocalHost NetworkInterface networkIn
  • 如何从 QListWidget 中删除项目

    每次我需要从 QListWidget 列表中删除 Item 时 我都会陷入使用 myItem hide 方法的困境 隐藏项目而不是删除 移除会使事情变得不必要的复杂 如果您向我展示如何从 ListWidget 中永久删除项目 我将不胜感激
  • Matplotlib:Times New Roman 显得粗体

    由于某种原因 当我在我的应用程序中使用 Times New Roman 时mpl情节显得粗体 其他字体都OK 这是一个最小的示例和结果 在 Word 文档中 用于与我期望的 Times New Roman 的外观进行比较 import ma
  • 我无法理解这一行 - 取消引用私有成员变量的地址还是什么?

    我不久前问过一个问题关于访问STL适配器的底层容器 我得到了一个非常有帮助的答案 template
  • 无法从 TypeScript 中的文件加载类

    我有一堂课 看起来像这样 export module GameModule export class Game private boardContainer HTMLElement private board number construc
  • 如何获取在其声明中实际键入的变量名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中查找传递给函数的变量名 下面的类包含字段城市 我需要动态确定在类声明中键入的字段名称 即我需要从对象城市的实例中获取字符串 city 我尝试通过检查 DoSomething 中的 Type
  • 将 const 指针引用绑定到非常量指针

    int val2 38 int ptr val2 const int ptrRef ptr ERROR int i 92 int ref i i const int ref i2 ref i OK 为什么我不能有一个引用非常量指针的常量引用
  • Java XML处理实体问题?

    当我尝试运行 java 程序时出现以下错误 它应该读取 xml 文件并打印出一些内容 据我了解 有一个未引用的实体不属于 xml 标准的一部分 所以我的问题是 我该如何解决这个问题 Thanks Fatal Error subject xm
  • Java中n++ VS ++n的区别

    我的 Java 老师说最好使用 n 而不是 n 我没有看到这背后的逻辑 有人知道吗 n增加该值并返回新值 n 增加值并返回old one Thus n 需要额外的存储空间 因为它必须跟踪旧值 以便在增量后可以返回它 我预计这两者之间的实际差
  • 在一张表上创建多对多

    Flask SQLAlchemy 给出了example如何创建多对多关系 它是在两个不同的表之间完成的 是否可以在同一个表上创建多对多关系 例如 一个姐妹可以有很多姐妹 而她也可以有很多姐妹 我努力了 girl sister map db
  • 从 git diff 中排除目录

    我想知道如何从 Git diff 中排除整个目录 在本例中为 spec 我正在使用 git diff 命令为我们的整个软件版本创建一个差异 然而 规格的更改与此过程无关 只会带来麻烦 现在我知道我能做到 git diff previous
  • MySQL两列时间戳默认NOW值ERROR 1067

    我有如下所示的表格 为了解决一个默认问题nowMySQL的列限制我使用了如图所示的提示here CREATE TABLE IF NOT EXISTS mytable id INT NOT NULL AUTO INCREMENT create
  • 使用另一个节点版本重新编译节点依赖项

    我想安装一些依赖项 在本例中安装 node pty 但是当我运行它时 他们给了我这个错误 错误 模块 home dev Documents project node web kit node modules node pty build R
  • 为什么结构/联合兼容性需要标记和名称相等?

    C99标准第6 2 7 1节中有以下语言 如果它们的标签和成员满足以下要求 则在单独的翻译单元中声明的两个结构体 联合或枚举类型是兼容的 如果其中一个使用标签进行声明 则另一个应使用相同的标签进行声明 如果两者都是完整类型 则适用以下附加要