C - 不同文件中全局定义的变量显示不带 extern 修饰符的外部链接

2023-12-23

彻底迷茫了。我很沮丧,因为我认为准确了解范围和链接如何工作很重要,但我一直看到有关的相互矛盾的信息extern我的编译器/链接器与我读到的内容相矛盾。

----------main.c--------------

int int1;

void main()
{  int1=6;
   printf("\nMain - int1 = %4d", int1);
   blippy();
   printf("\nMain - int1 = %4d", int1);
   return;
}

-------------第二个.c-------------

int int1;

void blippy()
{ printf("\nSecond - int1 = %4d", int1);
  int1++;
  return ;
}

输出是:

Main - int1 =    6
Second - int1 =    6
Main - int1 =    7

就好像 int1 的两个实例都指向一个具有外部链接的变量。我希望编译器要么抛出多重定义错误,要么将它们视为静态。我正在使用 Codeblocks,但我不知道它是否在幕后做任何自以为是的事情。


很大程度上是由于历史原因,int int1;既不是简单的声明,也不是简单的定义。它是一个暂定定义。如果没有正则定义int1在翻译单元(正在编译的源文件,包括其包含的所有文件)中,并且整个程序中只有一个定义,则暂定定义将充当常规定义。

但是,如果您在多个翻译单元中对同一标识符有暂定定义(没有常规定义),则该行为不是由 C 标准定义的。一些编译器(包括最近的 GCC)允许多个暂定定义,并允许链接器将它们合并为一个定义。从版本 10 开始,GCC 不再这样做,并允许链接器将它们视为多个定义,除非开关另有要求,-fcommon.

你(们)能做到int int1;通过提供初始值设定项进入常规定义,int int1 = 0;.

一些附加信息是here https://stackoverflow.com/questions/64841554/does-variables-declared-in-a-header-file-give-separate-copies-of-the-variables-t/64844348#64844348 and here https://stackoverflow.com/questions/66055165/advantage-of-using-extern-in-a-header-file/66056029#66056029.

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

C - 不同文件中全局定义的变量显示不带 extern 修饰符的外部链接 的相关文章

随机推荐

  • 在后台使用非托管库时无法更新 WPF GUI

    我在尝试使用 Emgu 从网络摄像头捕获图像时遇到了问题 为了完成此任务 Emgu 使用非托管 opencv 库 所以问题是我无法从 System Timers Timer Elapsed 事件更新我的 GUI WPF 图像控件 我知道它在
  • 使用 d3 画布强制定向图多条边

    我创建了具有多个边的强制有向图 但在渲染后它仅显示 其他一个相互重叠 我想创建类似的东西https bl ocks org mattkohl 146d301c0fc20d89d85880df537de7b0 index html https
  • Users.threads.list() 中缺少很多线程

    我正在使用 Users threads list 方法通过查询 in sent newer than 1y 从我的 GMail 帐户检索线程 结果的第一页 100 个线程 看起来不错 其中包含 2014 年 12 月和 2015 年 1 月
  • 如何在laravel中使用不同的redis连接

    我正在创建一个 laravel 包 在这个包中我需要在 redis 中保存一些数据 但我希望这个包使用不同的 redis 连接 这样如果他们可以在包的配置文件中设置 redis 详细信息凭证 并将使用此连接这个包 我想给包用户自由使用不同的
  • 使用 JAVA API 获取我的 Azure 订阅中所有资源的详细信息

    我正在寻找类似的东西this https stackoverflow com questions 17584084 get a list of all resources in my azure subscription powershel
  • 菜单栏右侧的摆动菜单项

    我有一个 swing 应用程序 在 JFrame 的菜单上我想添加一个帮助菜单项 但要使其右对齐 有任何想法吗 Swing JMenuBar 有一个 BoxLayout 我尝试过 menuItem new JMenuItem Help me
  • program.exe:Native' 已退出,代码为 255 (0xff)

    我正在使用 boost 线程 并且在使用 MD 编译时一切正常 但我真的更喜欢使用 MT 编译 然后我遇到的问题是program exe Native 已退出 代码为255 0xff 这发生在这条线上 thread 1 线程 testThr
  • 基准代码 - 除以迭代次数?

    我和我的朋友就 C C 代码 或一般代码 的基准测试进行了有趣的讨论 我们编写了一个简单的函数 它使用getrusage测量给定代码段的 CPU 时间 它测量运行特定功能所花费的 cpu 时间 让我举一个例子 const int itera
  • 检测 Android 模拟器何时完全启动

    我想创建一个脚本 在其中启动模拟器 并在系统完全启动后安装 apk 我如何知道模拟器何时完全启动以便我可以运行安装命令 这里http developer android com guide developing tools adb html
  • 使用 .prop(hidden: true) 在 JQuery 中隐藏按钮

    我试图弄清楚如何使用 prop hidden true 方法使用 JQuery 隐藏按钮 由于某种原因 在 Chrome 中 当我设置此值并查看 html 时 该按钮有一个隐藏元素 但该按钮仍然在页面上显示为可见 有任何想法吗 按钮没有隐藏
  • 从 Azure AD OAuth v2 令牌端点获取 client_credentials 令牌时,sub 和 oid 声明中包含什么内容?

    我可以在设置密钥 秘密后获取这些令牌 但我不知道是否或如何依赖我的应用程序中的子声明 有关更多背景信息 我的应用程序实际上是 B2C 注册应用程序 我将转到 B2C 租户中的 v2 端点 但没有指定策略来 使用客户端凭据流 可能会导致常规
  • 如何从对象中省略“删除”许多属性?

    我有两种返回以下类型的方法Pick
  • 指针数组的动态分配

    以下代码给出了分段错误 我不明白为什么 请参见 include
  • 如何在交叉编译环境中检测libc名称和版本?

    我的 Linux 桌面上有一些交叉编译器 有些使用 glibc 有些使用 uclibc 将来可能会有其他libcs too 目前 我可以进入他们的 sysroot 目录并搜索libc so并尝试查找它指向哪个文件名 例如libc so gt
  • SelectNodes 和 GetElementsByTagName

    SelectNodes 和 GetElementsByTagName 之间的主要区别是什么 选择节点 http msdn microsoft com en us library system xml xmlnode selectnodes
  • pdf.js 获取有关嵌入字体的信息

    我正在使用 pdf js 获取文本我得到带有字体信息的块 Object str blabla dir ltr width 191 433141 height 12 546 transform Array 6 fontName g d0 f2
  • 同时使用复选框和下拉菜单进行准确过滤

    我正在构建一个非常可排序 可过滤的图像库 其中包含很多标签 这个问题是基于这个如何让下拉菜单表现得像复选框 https stackoverflow com q 68315184在那里我得到了大部分问题的解答 编辑 这里进一步采取了这个问题的
  • 流上的 C++ 正则表达式

    我有一个非常大的文本文件 最多几百 MB 我想使用 STL 正则表达式对其进行处理 我正在寻找的匹配区域跨越几行 并且在文件中至少出现几千次 我可以使用流迭代器来实现此目的吗 我试过了std istream iterator
  • Linux 中没有 X.org 的 OpenGL

    我想在 Linux 中打开一个没有 X 的 OpenGL 上下文 有什么办法可以做到吗 我知道集成英特尔显卡硬件是可能的 尽管大多数人的系统中都有 Nvidia 卡 我想要一个适用于 Nvidia 卡的解决方案 如果除了通过集成英特尔硬件之
  • C - 不同文件中全局定义的变量显示不带 extern 修饰符的外部链接

    彻底迷茫了 我很沮丧 因为我认为准确了解范围和链接如何工作很重要 但我一直看到有关的相互矛盾的信息extern我的编译器 链接器与我读到的内容相矛盾 main c int int1 void main int1 6 printf nMain