使用 extern 和 #include 头文件有什么区别?

2023-12-22

我开始质疑“extern”关键字的有用性,该关键字用于访问其他模块(其他文件中)中的变量/函数。当我们使用 #include 预处理器导入带有变量/函数原型或函数/变量定义的头文件时,我们不是在做同样的事情吗?


extern之所以需要,是因为它声明该符号存在并且属于某种类型,并且不为其分配存储空间。

如果你这样做:

int foo;

在多个源文件之间共享的头文件中,您将收到链接器错误,因为每个源都会创建自己的 foo 副本,并且链接器将无法解析该符号。

相反,如果您有:

extern int foo;

在标头中,它将声明在每个源文件中的其他位置定义的符号。

一个(且仅有一个)源文件将包含

int foo;

它创建 foo 的单个实例供链接器解析。

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

使用 extern 和 #include 头文件有什么区别? 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • Python TypeError:^ 不支持的操作数类型:“float”和“int”

    我编写了一个简单的程序 它使用数值积分来近似计算定积分 然而 当谈到为什么我在标题中收到错误时 我感到很困惑 请记住 我已经一年半没有接触过Python了 所以这可能是我错过的一些非常明显的东西 但是如果你能帮助我 我仍然会很感激 这是代码
  • 如何升级gtk2hsC2hs?

    我在尝试cabal install glib 0 12 3在我的 Ubuntu 11 10 下使用 cabal install 0 10 2 但是 它显示以下错误消息 setup The program gtk2hsC2hs version
  • 如何在 Microsoft Access 2010 中设置与 SQL Server 2008 的 ADODB 连接?

    我刚刚在笔记本电脑上安装了 SQL Server 2008 我还安装了 Microsoft Access 2010 使用 VBA 我尝试在 SQL Server 上创建到我自己的数据库的 ADODB 连接 但我无法找到正确的代码行 当我在下
  • Xcode 在创建机器人时无法单击“下一步”?

    我正在尝试为测试项目设置一个机器人 我有一台运行服务器应用程序的 mac mini 该服务器对本地网络和所有人都是可见的 共享方案后 我进入 Xcode 并创建一个机器人 问题是 我无法启用右下角的 下一步 按钮 因此 我无法继续创建机器人
  • CoreBluetooth 无法找到设备,但 iOS 可以

    我有一个蓝牙条形码扫描仪 其规格说明它是蓝牙 2 0 2 类 这很奇怪 因为我的 iPhone 5 iOS7 可以找到并连接它 我以为iOS只能连接BLE设备 但在我的应用程序中 我无法扫描该设备 我不知道这是否是因为它的蓝牙规格 我希望有
  • 在 Spray 中发送发布请求

    我需要使用以下命令发出一个简单的 HTTP 请求spray框架 我在他们的网站上找到了一些示例 但结果证明它们很复杂并且涉及 Akka 这对我来说不是必需的 此外 我需要能够填写请求的标头 例如X Application content t
  • R 中的 strsplit 与元字符

    我有大量数据 其中分隔符是反斜杠 我正在 R 中处理它 并且很难找到如何分割字符串 因为反斜杠是一个元字符 例如 一个字符串看起来像这样 1128 0019 XA5 E2R 366 00 15 我想把它分成 字符 但是当我运行 strspl
  • Python Pillow:制作透明度渐变

    我有在图像上添加渐变的代码 def st path gradient magnitude 2 im Image open path if im mode RGBA im im convert RGBA width height im siz
  • 如何使用以编程方式创建的按钮在 WPF MVVM 中创建 OnClick 命令?

    我正在编写一个 WPF 应用程序 它以编程方式创建一些按钮 如何为 ViewModel 中的按钮创建 OnClick 命令 我想添加一个命令来使用 ResetButton 清除所有文本框 new StackPanel Orientation
  • 如何在 Flask-restless 中返回“已存在”错误?

    我想做一些异常处理程序 我在 python 中使用 Flask restless 和 SQLAlchemy 的组合 我的问题 当我使用数据库中已存在的对象向 api 发送请求时 SQLAlchemy 显示异常 IntegrityError
  • MYSQL左连接来自多个表的COUNTS

    我想添加表示其他表中的计数的列 我有3张桌子 Messages MessageID User Message Topic 1 Tom Hi ball 2 John Hey book 3 Mike Sup book 4 Mike Ok boo
  • Websocket连接自动关闭?

    我是网络套接字编程的新手 我有以下 JavaScript 客户端代码 var connection new WebSocket ws localhost 8080 OmegaThings registerdevice connection
  • 输入字段在 Chrome 和 Firefox 中显示不同

    我在 Chrome 中进行了测试 显示正常 但在 Firefox 中 输入框比预期大 这是标记 div class form wrapper div
  • 绘制离屏 CALayer 内容的最快方法

    我正在寻找在 macOS 上绘制离屏 CALayer 内容 不需要 Alpha 的最快方法 请注意 这些示例不是线程化的 但重点是 以及为什么我不只是使用 CALayer setNeedsDisplay 因为我正在后台线程上进行此绘图 我原
  • itunes 上缺少本地化屏幕截图错误

    我已选择默认语言 澳大利亚英语 作为默认语言 当我提交二进制文件时 它显示为被拒绝的 红色图标 状态为 缺少本地化屏幕截图 该应用程序仅使用单一语言 我添加了屏幕截图 该应用程序仅适用于 iPhone 当我查看显示为的二进制信息时 本地化
  • 可以监控 STM 的争用级别吗?

    有没有办法轮询 Clojure 的 STM 事务是否正在重试 以及重试的速率是多少 您可以观察history count一个 ref 将表明存在争用 user gt def my ref ref 0 min history 1 user m
  • Servlet 会话超时

    我正在编写我的 Spring MVC Web 应用程序 我将会话时间设置为 10080 分钟 相当于 1 周 现在我想让用户每次打开浏览器时都保持登录状态 sessionService setcurrentUser myuser HttpS
  • 从 Android Studio 运行应用程序时,在 Gradle 任务 processManifest.doLast 中编辑 AndroidManifest.xml 无效

    我使用以下 Gradle 脚本在编译时对 AndroidManifest xml 进行一些修改 在这个例子中我想注入一个
  • TFS 团队构建日志单元测试结果

    我们正在使用 TFS 2010 Team Build 它会在构建过程中自动运行我们的单元测试 如果单击 查看日志 我可以看到运行的测试列表和每个测试结果 成功 失败 如果发生失败 我想查看测试结果输出 以便开发人员可以找出失败的原因是什么
  • 使用 extern 和 #include 头文件有什么区别?

    我开始质疑 extern 关键字的有用性 该关键字用于访问其他模块 其他文件中 中的变量 函数 当我们使用 include 预处理器导入带有变量 函数原型或函数 变量定义的头文件时 我们不是在做同样的事情吗 extern之所以需要 是因为它