为什么在 main() 内声明 extern 变量可以工作,但在 main() 内定义它却不起作用?

2023-12-08

这看起来很微不足道,但对以下行为的严格解释将有助于我的理解extern很多。所以我会很感激你的回答。

在下面的示例程序中,我声明了一个extern多变的x在函数内部(main())。现在,如果我在文件范围内定义变量main()并分配8到它,那么程序就可以正常工作并且8被打印。但是如果我定义变量x inside main()之后printf(),期待extern声明链接到它,然后它失败并给出以下错误:

test.c||In function 'main':|
test.c|7|error: declaration of 'x' with no linkage follows extern declaration|
test.c|5|note: previous declaration of 'x' was here|
||=== Build finished: 1 errors, 0 warnings ===|


#include<stdio.h>

int main()
{
extern int x;
printf("%d",x);
int x=8;   //This causes error
} 
//int x=8;   //This definition works fine when activated

我在代码中只看到一个错误,即该语句int x=8意味着我们正在声明x再次作为变量auto存储类。其他我不明白。你能告诉我以下内容吗:

1)为什么我们可以声明extern多变的inside一个函数,没有任何警告或错误?如果有效,它到底意味着什么?

2)自从我们宣布x as extern在函数内部并且没有显示错误,为什么这个声明不链接到函数内部变量的定义,而是在外部定义变量时查看外部?存储类声明是否冲突auto-vs-extern这是为什么?


extern变量声明是对编译器的承诺,即存在一个变量的定义global变量在其他地方。局部变量不符合对编译器的承诺,因为它们对链接器是不可见的。从某种意义上说,extern声明类似于函数的前向声明:您对编译器说“我知道这个函数在那里,所以让我现在使用它,并让链接器负责定位实际的实现”。

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

为什么在 main() 内声明 extern 变量可以工作,但在 main() 内定义它却不起作用? 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • dateFromString 更改后 24 小时返回 nil

    NSDateFormatter timeFormat NSDateFormatter alloc init timeFormat setDateFormat hh mm a NSDate sourceDate timeFormat date
  • 在 JNI 中返回多维数组

    我想将一个已经存在的多维数组从 C 返回到 Java 代码 我的代码如下 int cells 3 3 0 int Java com packagename appname GameView addNew JNIEnv env jobject
  • 三.js概述

    是否可以使用 Three js 在我的 3D 模型上显示黑色轮廓 我想要看起来像 无主之地 2 的图形 卡通阴影 黑色轮廓 我确信我来晚了 希望这能解决稍后某人的问题 这是交易 您不需要渲染一切两次 开销实际上并不大 您所需要做的就是复制网
  • PHP DOMDocument 没有 DTD、head 和 body 标签?

    是否可以使用 DOMDocument 类但不允许它添加 doc 类型声明 head 和 body 标记 我正在为服务器端包含编写当前的代码 并且它正在呈现在已经格式良好的页面上 我不需要额外的标签 Wrikken 所说的或者 对于 PHP
  • 使用 2 个日期参数之间(含)之间的日期填充临时表的最简单方法

    使用包含两个日期参数和两个日期参数之间的日期填充临时表的最简单方法是什么 我只需要该月日期的第一天 例如 如果 StartDate 2011 01 01 和 EndDate 2011 08 01 然后我希望将其返回到表中 2011 01 0
  • 在 UITableViewCell 和 UITableViewController 之间传递数据?

    我在 xcode 4 6 中创建了主详细信息模板项目 并添加了带有 2 个文本字段的自定义单元格 我还创建了新类 它是 UITableViewCell 的子类 在这个类中我创建了文本字段的出口 当用户键入某些内容时 NSMutableArr
  • 丢弃限定符错误

    对于我的 compsci 类 我正在实现一个 Stack 模板类 但遇到了一个奇怪的错误 Stack h 在成员函数 const T Stack
  • MySQL SELECT 唯一列,其中其他列是最大的

    我有这样的桌子 id serial num version 1 1 1 2 2 1 3 2 2 4 3 1 5 4 1 6
  • 有没有办法“逃避”ElasticSearch 停用词?

    我对 ElasticSearch 相当陌生 有一个关于停用词的问题 我有一个索引 其中包含美国的州名 例如 纽约 纽约 加利福尼亚 加利福尼亚 俄勒冈 俄勒冈 我相信俄勒冈州的缩写 OR 是一个停用词 因此当我将州数据插入索引时 我无法搜索
  • Python - 使用列表创建字典

    我在列表中有以下字符串 并且能够使用该列表作为字典中的键并分配默认值 来创建字典 当我打印时 我看到字典是按照列表中字符串的相反顺序创建的 为什么会发生这种情况以及如何纠正它 是否需要反向语法 a hello bye tc iam crea
  • 由于 CORS 问题,无法从 Azure APIM 后面的网页调用 API

    我正在使用 Azure APIM 我的 API 托管在由 net core 编码的 Azure 应用服务上 我已经在 APIM 后面配置了我的 api 然而 当我尝试调用我的 API 时 我遇到了这个问题 访问从原点 获取 http 本地主
  • PHP,来自字符串的虚拟文件,无需写入硬盘

    如果我有一个字符串 包含pdf文件 可以制作一个 虚拟 文件以避免在硬盘上写入 以便稍后在需要现有文件的函数上使用 theorical code file stringToVirtualFile string require file Yo
  • 如何在 QLineEdit 中使用 std::string ?

    我有以下问题 我正在尝试将我编写的大量代码与 Qt 界面集成 我的一些函数返回std string 我没有成功制作QLineEdit setText接受它们 其他函数返回char不要给我带来问题 我应该怎么办 谢谢 朱塞佩 尝试这个 std
  • 未捕获的语法错误:JSON 中位置 0 处出现意外标记 u

    仅在结帐和单个产品页面上 我在控制台日志中收到以下错误 VM35594 1 Uncaught SyntaxError Unexpected token u in JSON at position 0 at JSON parse
  • 如何删除推送通知API

    Apple 在提交 iOS 应用程序时发送以下电子邮件 缺少推送通知权利 您的应用程序似乎包含用于注册 Apple 推送通知服务的 API 但应用程序签名的权利不包括 aps environment 权利 如果您的应用程序使用 Apple
  • 将简单注射器与 Umbraco 控制器结合使用

    我试图将依赖项注入到继承自 Umbraco 的 RenderMvcController 的控制器中并收到错误 找不到 RenderMvcController 类型的注册 并且无法进行隐式注册 为了让容器能够创建 RenderMvcContr
  • nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别[重复]

    这个问题在这里已经有答案了 我目前正在学习 Python 并且遇到了分配列表的问题 In def nextPermutation self nums List int gt None 我有一行代码可以反转列表 如下所示 nums nums
  • 二维数组动态内存分配崩溃[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中正确设置 访问和释放多维数组 我正在尝试使用 calloc 为 2D 数组动态分配内存 列固定为 2 因此只有行是动态的 这是我一直在尝试的 unsigned int pts rows
  • 每个关键字的前 'n' 个结果

    我有一个查询 要获取对特定关键字发表评论的前 n 个用户 SELECT user COUNT AS magnitude FROM results WHERE keyword economy GROUP BY user ORDER BY ma
  • 为什么在 main() 内声明 extern 变量可以工作,但在 main() 内定义它却不起作用?

    这看起来很微不足道 但对以下行为的严格解释将有助于我的理解extern很多 所以我会很感激你的回答 在下面的示例程序中 我声明了一个extern多变的x在函数内部 main 现在 如果我在文件范围内定义变量main 并分配8到它 那么程序就