当涉及数组时,声明不应该与其定义相匹配吗?

2024-04-01

我的程序中有两个源文件。

数组定义在A.cpp.

// compiler: MSVC2005 SP2    
// A.cpp

// defines an array of type "int [100]"
int a[100] = {3};

它用于B.cpp.

// B.cpp

// declares an array of type "int []"
extern int a[];

int main()
{
  // prints 3 correctly
  cout << a[0] << endl;
  return 0;
}

AFAIK,如果使用声明的标识符,链接器找不到声明的任何匹配定义,则会引发错误。这里,int [] and 整数 [100]显然,这是两种不同的类型。

在这种情况下,为什么没有任何链接错误?是否由以下保证标准在声明/定义匹配期间数组大小是微不足道的?或者它只是特定于实现的?引用自标准如果有的话将不胜感激。

Edit:iammind在他的回答中提到链接器可以正确运行(他的编译器是gcc)即使声明和定义之间的类型不匹配。它是标准所要求的还是只是 gcc 的一种方式?我想这是一个更重要的问题需要弄清楚。


在 C 和 C++ 中,对象的声明a不完整类型将匹配对象的定义a其中类型已完成。您所观察到的只是说明了这样一个事实:在 C++ 中,您可以在非定义声明中使用不完整类型。但是一旦获得定义,类型就必须是完整的。

此行为不限于数组。例如,您可以声明

extern class X x;

对于一个完全未知的班级X,然后,当class X已经完全定义了,你可以定义

X x;

这将与上面的声明相匹配。

您的阵列也会发生同样的情况。首先声明一个不完整类型的对象

extern int a[];

然后用完整类型定义它

int a[100];

这里的类型确实不匹配。然而,C++ 语言从不要求它们匹配。例如,3.9/7明确指出

数组对象的声明类型可能是未知大小的数组 因此在翻译单元中的某一点是不完整的并且 稍后完成;这两个点的数组类型(“数组 T 的未知边界”和“N T 的数组”)是不同的类型。

代表着the same数组对象最初可以具有不完整的类型,但稍后会获取完整的类型。 (另请参见 3.9/7 中的示例)。当然,这并不意味着您可以声明a as an int然后将其定义为double。同样,您在这里拥有的唯一与类型相关的自由是完成不完整的类型。不再。

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

当涉及数组时,声明不应该与其定义相匹配吗? 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • JavaScript 数组扩展语法的时间复杂度是多少?

    我想知道在 JavaScript 中使用数组扩展的时间复杂度是多少 是线性 O n 还是常数 O 1 下面的语法示例 let lar Math max nums 传播称为 Symbol iterator 有关对象的属性 对于数组 这将迭代数
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • BigQuery JDBC 驱动程序返回的行数不会超过 100,000 行

    我在 Pentaho PDI 中使用 Google BigQuery 的 starschema JDBC 驱动程序 http code google com p starschema bigquery jdbc http code goog
  • AWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略

    我们正在尝试实现 lambda 函数 该函数将根据源 S3 存储桶事件将对象从一个 S3 复制到跨账户中的另一个 S3 存储桶 目前 我们能够在同一 SAG 内的源和目标之间复制文件 但是当我们尝试跨账户实现相同的逻辑时 得到了 CopyO
  • windows下Qt应用程序和窗口图标

    我通过嵌入包含图标的标准 Windows 资源文件创建了一个简单的应用程序图标 不过 我还想在我的主应用程序窗口上使用此图标 是否有捷径可寻 到目前为止 似乎唯一的方法是单独加载包含窗口图标的图标 而不是重用已经存在的图标 这似乎是一个可怕
  • 更改 foreach 循环内的初始数组?

    我想要一个 foreach 循环 其中初始数组在循环内更改 eg array array red blue foreach array as key gt value array white echo value br 在此循环中 尽管我在
  • iOS Google 静默登录提供了缺少个人资料信息的(有效)令牌

    我已将 Google SignIn SDK v4 0 1 集成到我的 iOS 应用程序中 正常的身份验证过程通过以下方式正常工作 GIDSignIn sharedInstance signIn 检索到的 idToken 有效 包含电子邮件和
  • 如何使用 .Net 处理程序处理 .asp 扩展名?

    我有一个旧的经典 ASP 网站 我正在将其迁移到 IIS7 5 我不想在服务器上安装经典 ASP 因此我只想将 asp 文件视为 aspx 文件 我该如何在 IIS7 5 中执行此操作 编辑 澄清一下 我并不是在问如何让经典的 ASP 代码
  • Highstock日期输入jquery ui datepicker位置变化

    在 Highstock 中 您可以使用 jquery ui datepicker 而不是在日期字段中输入文本 如本演示所示 http jsfiddle net hcharge aNde9 http jsfiddle net hcharge
  • 在 Chrome 中播放多种声音

    我正在为 Facebook 开发 HTML5 游戏 我有以下 HTML 代码
  • 如何让小圆圈的边框变得平滑?

    有没有办法让纯 CSS 圆形边框在较小尺寸下看起来清晰明快 或者有什么方法可以使边框在外边缘周围不出现 锯齿状 非常感谢 Use box shadow针对此问题的 CSS 属性 请看下一个例子 http jsfiddle net RJMWR
  • GCC最高指令集,兼容多种架构

    我正在由具有不同架构的机器组成的集群上运行作业 gcc march native Q help target grep march cut f3给了我其中之一 broadwell haswell ivybridge sandybridge
  • 你能建议一个好的 minhash 实现吗?

    我正在尝试寻找一个可以在我的工作中利用的 minhash 开源实现 我需要的功能非常简单 给定一个集合作为输入 实现应该返回其 minhash 首选 python 或 C 实现 以防万一我需要破解它才能为我工作 任何指示都会有很大帮助 Re
  • 如何在 C# 注册表类中使用 REG_OPTION_OPEN_LINK

    我想打开一个符号链接的注册表项 据微软称 https learn microsoft com en us windows win32 api winreg nf winreg regopenkeyexw parameters我需要使用REG
  • 使用 NSDocument 时如何将故事板视图绑定到核心数据实体?

    我正在构建一个使用核心数据 NSDocument 故事板和 Cocoa 绑定的 OS X 应用程序 我的期望是发生以下情况 一个实例MyDocument NSDocument子类 被创建 MyDocument创建核心数据NSManagedO
  • Google Play -505 安装错误

    我在 Google Play 中有一个应用程序 它是使用工具和 API 22 构建的 一切运行良好 但上次使用 API 23 工具 23 1 的更新向用户显示编号为 505 的 Android 6 0 错误 在 Google Play 应用
  • Python/Django - 避免在源代码中保存密码

    我使用 Python 和 Django 创建 Web 应用程序 并将其存储在源代码管理中 按照 Django 通常的设置方式 密码在 settings py 文件中以纯文本形式显示 以纯文本形式存储我的密码会给我带来许多安全问题 特别是因为
  • 有没有办法从 json-server 文件生成 swagger.json

    对于原型设计 我们使用 json server 库 它根据我们的 db json 文件创建假 REST api 现在我们想使用 swagger 所以我的问题是 有没有办法从我们的 db json 文件生成 swagger json 如果没有
  • 如何在 Android 中拍照、保存并获取照片

    我一直在搜索拍摄照片的简单示例 并使用 URI 保存它并检索照片进行图像处理 我尝试了很多示例代码 但没有一个顺利 有人有示例代码吗 像这样定义一个变量 protected static final int CAPTURE IMAGE AC
  • 维护程序集版本号的最佳实践/指南

    我正在寻找有关如何管理 NET 程序集的三个不同程序集版本号的指示 建议甚至指示 产品版本是最简单的 因为这通常是由业务决定的 然后 文件版本似乎用于部署之间的版本控制 其中实际的程序集版本仅在发货时使用 现在 我只是在寻找一种简单的方法来
  • now() 作为参数传递给函数时如何求值

    我有一个表 它是按带有时区字段的时间戳进行范围分区的 我非常惊讶地发现以下 where 条件导致规划器查询分区中的每个 子 表 WHERE reading time gt now 72 00 00 interval 据我所知 规划器不知道执
  • 当涉及数组时,声明不应该与其定义相匹配吗?

    我的程序中有两个源文件 数组定义在A cpp compiler MSVC2005 SP2 A cpp defines an array of type int 100 int a 100 3 它用于B cpp B cpp declares