static 修饰的全局变量具有内部链接的一个例子

2023-05-16

很久不能明白这个事情,下面自己来举个例子吧:

文件1.c

#include <stdio.h>
extern int s;

int main()
{
	printf("%d\n",s);
	return 0;
}

文件2.c

int s = 1234;

这里s是定义在2.c中的,如果1.c中只要进行外部变量声明,即如下:

extern int s;

那么1.c就可以使用2.c中的变量s,当然,编译的时候需要2个文件一起编译,在gcc中执行如下指令:

gcc 1.c 2.c -o outputfile

outputfile就是一个可执行文件了。运行结果如下:

1234

之所以1.c能使用2.c中的变量,就是因为2.c中的变量s具有外部链接(全局变量默认是外部链接的),但是如果在2.c中的s定义的时候前面加了static,那么2.c中的s就是内部链接的了(static会改变全局变量的链接),那么结果会怎么呢?结果是:1.c不能使用s了,如下:

文件2.c

int s = 1234;

文件1.c

#include <stdio.h>

extern int s;

int main()
{
	printf("%d\n",s);
	return 0;
}

然后1.c和2.c一起编译,下面是我在gcc编译器中进行编译:

gcc 1.c 2.c -o outputfile

执行上述编译指令后,出现如下错误:

/usr/bin/ld: /tmp/cctCoYse.o: warning: relocation against `s' in read-only section `.text'
/usr/bin/ld: /tmp/cctCoYse.o: in function `main':
1.c:(.text+0xa): undefined reference to `s'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

英文看不懂,反正是不能使用了。

补充:下面是自己在网上找到的一篇文章,虽然云里雾里的,但是仔细体会,还是能体会到一些知识:

C 中与 static 关键字的内部链接

[英] Internal linkage with static keyword in C

本文介绍了C 中与 static 关键字的内部链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道 static 是 C 中的一个重载关键字.在这里,我只对它作为关键字来强制执行内部链接感兴趣.

如果您在 .c 文件中声明了一个全局变量,使用 static 和不使用 static 有什么区别?无论哪种方式,没有其他 .c 文件可以访问该变量,因此该变量基本上对文件来说是私有的",无论是否带有 static 关键字.

例如,如果我有一个文件 foo.c,并且我声明了一个全局变量:

int x = 5;

那个变量 x 仅可用于 foo.c 内的代码(当然,除非我在某些共享头文件中使用 extern 声明它)> 关键字).但是如果我不在头文件中声明它,如果我要输入会有什么不同:

static int x = 5.

无论如何,x 似乎在这里有内部联系.所以我对 static 在这方面的目的感到困惑.

推荐答案

如果您在 .c 文件中声明了一个全局变量,使用 static 和不使用 static 有什么区别?无论哪种方式,没有其他 .c 文件可以访问变量 [...]

一个不同的文件可以声明 x:

extern int x;

这将允许编译引用 x 的代码,然后链接器会很高兴地将这些引用链接到它找到的任何 x.

static 通过防止 x 在其翻译单元之外可见来防止这种情况.

这篇关于C 中与 static 关键字的内部链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

 

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

static 修饰的全局变量具有内部链接的一个例子 的相关文章

  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 跳进C语言的一个块

    如果我像这个例子一样跳进一个块 跳过 声明 include
  • 为什么 C# 运算符重载必须是静态的?

    为什么 C 要求运算符重载是静态方法而不是成员函数 如 C 也许更具体地说 这个决定的设计动机是什么 埃里克 利珀特 Eric Lippert 在一篇文章中对此进行了极其详细的回答 博客文章 https ericlippert com 20
  • 函数的“static new”修饰符有什么意义?

    今天 我在遗留代码中发现了一些东西 它具有 静态新 一项功能 看起来像这样 class Foo public static void Do Console WriteLine Foo Do class Bar Foo public stat
  • 包含 std::string 常量的类

    所以我目前正在使用 C 进行一个学校项目 我对此并不熟悉 我想创建一个类 包含我所有的常量 字符串 整数 双精度 自己的类 我正在尝试这个 这在 Java 中一直对我有用 class Reference Picture Paths publ
  • 静态方法与非静态方法

    下面是静态方法和非静态方法的php类代码示例 示例1 class A None Static method function foo if isset this echo this is defined echo get class thi
  • 在 Objective-c 问题中访问委托静态方法

    我在 Objective c 中遇到了一个奇怪的问题 这是代码 STViewController h import
  • 重写 PHP 中的静态方法

    我有一个抽象页面类 如下所示 abstract class Page public static function display self displayHeader self displayContent self displayFoo
  • 在哪里定义与 symfony2 中的实体相关的静态数组?

    我有一个数组包含与实体相关的静态数据Product public static category array 1 gt animal png 2 gt blague png 3 gt devinette png 4 gt enfant pn
  • C++ static constexpr 成员在类外重新声明

    对于以下代码 为什么 main 中的第一个案例无需重新声明 Foo bar 就可以正常工作 而带有该函数的第二个案例则需要它 struct Foo static constexpr int bar 30 Declaration of Foo
  • 同一应用服务中的 Azure 函数是否在同一实例中运行

    我有一个场景 我的一个类有一个静态成员 我可以从函数应用程序设置其值 假设属于同一应用服务计划的另一个功能应用也使用同一个类 并且也设置 依赖静态成员的值 现在 如果两个功能应用程序从不同时运行 我们就没有问题了 另外 如果它们不在同一个实
  • 函数内的静态变量如何工作?

    在下面的代码中 int count static int n 5 n n 1 return n 变量n仅在第一次调用该函数时实例化一次 应该有一个标志或其他东西 所以它只初始化变量一次 我试图查看 gcc 生成的汇编代码 但没有任何线索 编
  • 在node.js Express框架中设置两个不同的静态目录

    是否可以 我想设置两个不同的目录来提供静态文件 假设 public 和 mnt 您还可以通过指定附加 第一个 参数来设置将静态文件提供给 Web 的路径use 像这样 app use public express static dirnam
  • 如何将模块化 Sinatra 应用程序部署到 Heroku?

    由于某种原因 我无法访问公共目录中的任何文件 未发现错误 我不会把public显然 URL 中的一部分 查看GitHub 上的 Lovers 源代码存储库 https github com mattdipasquale loversapp
  • C++ 模板静态成员实例化

    include
  • 在C++中初始化静态指针

    我有一个带有静态成员的类 它是一个指针 如下所示 动画 h class Animation public Animation static QString m 动画 cpp include animation h QString Anima
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 如何在静态方法中获取会话变量的值?

    我正在使用带有 jQ uery 的 ASP NET 页面方法 如何在 C 中的静态方法中获取会话变量的值 protected void Page Load object sender EventArgs e Session UserName
  • Sails js 路由静态 html

    我想在我的 sails js 应用程序中完全分离客户端和服务器端 如果我删除 路由 它将自动从 assets 文件夹中提供一个名为index html的文件 我想从资产文件夹中提供另一个文件 我该怎么做 如果你看看 sails 使用的中间件

随机推荐