c语言不同源文件变量,我在哪里可以在c程序中声明全局变量,无论是在头文件还是源文件中...

2023-05-16

本问题已经有最佳答案,请猛点这里访问。

嗨,我是一个C++开发者,现在我正在做C编程。

我的问题是,在C程序中,哪个地方更好地声明全局变量。头文件或源文件(如果我的全局变量未在其他文件中使用)?

我希望这个变量像C++中的私有变量一样。

不应将全局非常量变量放在任何位置。与extern中声明的全球,可用于整个项目。这样做的必要性总是源于糟糕的程序设计,周期。这对于C和C++都是正确的。

例外情况是const变量,可以跨多个文件共享。

在需要文件范围变量的情况下,它们应该在.c文件中声明,并且始终作为static。不要将它们与"globals"混淆,因为它们是声明它们的翻译单元的本地部分。更多关于static文件范围变量如何有意义的信息。

还要注意C标准未来语言方向:

Declaring an identifier with internal linkage at file scope without

the static storage class specifier is an obsolescent feature.

因此,如果不使用static,您的代码可能无法在C标准的下一个版本中编译。

哦,很好的解释

假设您的变量是全局变量和非静态变量。

您需要在头文件中声明它。我们对此使用extern关键字。正如注释中指出的,这个关键字是不必要的,但是大多数C用户更喜欢在头中使用它,这是一个惯例。

堆栈溢出.h:

#ifndef STACHOVERFLOW_H

#define STACHOVERFLOW_H

extern int my_var;

#ifndef

然后在源文件中初始化它。(如果要提供初始化值,则禁止使用关键字extern)。

栈溢出

#include"stackoverflow.h"

int my_var = 50;

不要将初始化值放在头中,否则如果头至少使用两次,则会出现链接器错误。

现在您可以在任何其他模块中使用您的变量,方法是包含头部。

主C

#include

#include"stackoverflow.h"

int main()

{

printf("my_var = %d

", my_var);

return 0;

}

在"stackoverflow.c"中包含头"stackoverflow.h"是一种确保源文件中的定义与头文件中的声明匹配的方法。这允许在编译时立即出现错误,而不是有时出现神秘的链接器错误。

编辑:这根本不是使变量"私有"的方法。必须使用静态变量使其成为"私有"。见R sahu的答案

一旦我们在stackoverflow.c中包含stackoverflow.h。编译器会把所有的东西复制粘贴到stackoverflow.c中,对吗?那为什么要在外面呢?对不起,如果我的问题是愚蠢的

是的,你说得对。它指向我的答案,对吗?

抱歉,亲爱的@user3302647我没有得到答案。我的问题是有必要把extern int my_var放在stackoverflow.h中。

不,没有必要:)

@巴维,你同意我的回答吗?

@Bhavithcacharya更新了我的答案,使事情更清楚。

@用户3302647。是的,我同意你的回答。谢谢。我的理解是,如果我使用extern键,那么它也可以访问其他源,它将具有更新的值,对吗?

@我误解了这个问题。这根本不是使变量"私有"的方法。你应该接受R sahu的回答而不是我的。

我很同意你的回答谢谢

当全局变量源于有缺陷的程序设计时,需要声明非常量变量。你不应该这样做。但是,有些情况下,文件范围static变量是有意义的。这些不是全球性的。

在C程序中,哪个地方更适合声明全局变量

答:在源文件(*.c)中。

假设场景类似,我在头文件中声明了一个变量。我把这个头包含在两个不同的.c文件中。在编译的宏扩展步骤之后,这两个文件将具有相同名称的全局变量。因此,它将在链接期间抛出一个错误,比如变量的多个声明。

结论:

将所有全局变量声明保存在.c文件中,如果在其他文件中不需要,则将其作为static。

如果需要从其他文件访问,在相应的头文件中添加该变量的extern声明。

@用户332647 static变量在*.c或*.h中?

将其添加到*.c文件中

如果您打算在多个.c文件中使用全局变量,最好在.h文件中声明它们。但是,如果希望保持变量如EDCOX1×7的C++类中的成员数据,最好通过函数提供对全局数据的访问。

而不是

extern int foo;

使用

int getFoo();

void setFoo(int);

这种类型模仿类的成员变量的private访问说明符。

@萨胡。假设在header test.h中,我声明了一个变量extern int a' and modified the value ofa` in test.c。如果我尝试在test2.c中使用a,那么我的a将以修改后的值或新的a存储。

是的,当然。

如果您希望它是全局的(外部链接),您应该将它放在.h文件中。我认为这是最好的做法之一:

公共报头

#ifdef YOUR_SOURCE

#define EXTERN

#else

#define EXTERN extern

#endif

EXTERN int global_var;

YouSux.c

//your source makes definition for global_var

#define YOUR_SOURCE

#include

其他来源

#include //other sources make declaration for global_var

如果您希望它是私有的(内部链接),我认为最好的解决方案就是在源文件中正确地定义它,而不是在头文件中,以防止头文件被另一个源包含,然后使其混淆。

你的简历

static int private_var;

为什么它在source.c中应该是静态的?为什么不能是非静态的?有什么原因吗?。是因为将其设置为本地文件吗?

是的,就像我提到的,如果你想它是私有的(从其他来源的文件看不到),那么它需要与static一起使用。

一般来说,您可以在源文件中定义变量,如int g_foo;,然后在具有extern的其他文件中引用这个全局变量,如extern int g_foo; do_sth(g_foo);。您可以将extern int g_foo;声明放在头文件中,并将其包含在其他源文件中。不建议在头文件中定义数据。

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

c语言不同源文件变量,我在哪里可以在c程序中声明全局变量,无论是在头文件还是源文件中... 的相关文章

  • 不要再被骗了------QQ盗号原理大揭秘

    前言 相信大家在懵懂无知的时候都有被盗号的经历吧 xff0c QQ胡乱的加好友 xff0c 突然有个好友传了个文件给你 xff0c 打开以后发现QQ竟然显示强制下线 xff0c 然后再也上不去了QAQ xff0c 很明显 xff0c QQ号
  • 移动端唤起键盘时取消position:fixed定位

    当在移动端按钮position fixed 底部bottom 0 固定定位后 xff0c 当唤起键盘输入数据时就会出现很头疼的问题 xff1a 固定在底部的按钮会被系统自带的键盘挤上去 xff0c 占用输入框位置 xff1b 如图 xff1
  • nginx根据访问的url参数或者是请求 头部做判断转发

    在http请求后端时 xff0c token是一种非常常见的使用方式 xff0c 但是如果url请求参数不带token xff0c 或者请求头部不带token这样的请求应当直接返回401 xff0c 而不要代理给后端服务器做处理了 可以有效
  • java 获取HttpRequest Header 的几种方法 & 请求request的所有参数实现方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在开发应用程序的过程中 xff0c 如果有多个应用 xff0c 通常会通过一个portal 门户来集成 xff0c 这个portal 是所有应用程序的入口 xff0c 用户
  • CISCO路由器license激活图解教程

    此次也是一台CISCO 3945E K9路由器 xff0c 新设备启动后执行show version命令查看版本信息 xff1a 以下为show version中license信息 License Info License UDI Devi
  • 动态创建HTML内容

    document write xff08 xff09 方法 document write方法可以方便快捷的把字符串插入到文档里 它最大的缺点是违背了 分离javascript 原则 即使把document write语句挪到外部函数里 xf
  • Linux练习(write写入)

    include lt unistd h gt include lt stdlib h gt int main if write 1 34 here is some data n 34 18 61 18 write 2 34 write er
  • matlab练习程序(随机游走图像)

    随机游走类似布朗运动 xff0c 就是随机的向各个方向走吧 虽然代码没什么技术含量 xff0c 不过产生的图像实在太漂亮了 xff0c 所以还是贴上来吧 产生的图像 xff1a matlab代码如下 xff1a clear all clos
  • [翻译完成] 树莓派搭建Google TV

    为什么80 的码农都做不了架构师 xff1f gt gt gt Google TV是啥玩意 Google TV是支持自选图像 宽带网络 传统电视信号的综合平台 xff0c 更附带电视节目搜索功能 谷歌公布了其新版电视的两个版本 第一个叫做B
  • jdk17.0.1安装教程

    1 解压到某文件夹 2 在此电脑 gt 属性 gt 高级系统设置 gt 环境变量 gt 系统变量 加一条JAVA HOME 3 在系统变量Path里 xff0c 加一条 JAVA HOME bin xff08 不能放在第一条 xff09 4
  • 推荐几本GIS专业书籍

    对于开设GIS专业的高校 xff0c 基本上都会有自己的专业教材 xff0c 用的比较多的像邬伦的 地理信息系统 xff1a 原理 方法和应用 和中科院陈述彭院士的 地理信息系统导论 在当初考研的时候 xff0c 自己也买了不少教材 xff
  • Linux 通过命令发送udp 数据

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如果往本地UDP端口發送數據 xff0c 那麼可以使用以下命令 xff1a echo hello gt dev udp 192 168 1 81 5060 意思是往本地19
  • Qt学习之路(17): Qt标准对话框之QMessageBox

    好久没有更新博客 xff0c 主要是公司里面还在验收一些东西 xff0c 所以没有及时更新 而且也在写一个基于Qt的画图程序 xff0c 基本上类似于PS的东西 xff0c 主要用到的是Qt Graphics View Framework
  • 2019年开发者必读!20位阿里技术大牛们帮你列了一份经典书单! ...

    导读 xff1a 寒冬中 xff0c 最值得投资的是学习 xff0c 是增厚的知识储备 下面就是20位阿里技术大牛们为我们推荐的经典书籍 书籍类型涉及技术 管理 哲学等方面 xff0c 希望这些书籍陪伴你度过这个漫长的寒冬 书单之外 xff
  • 发表一篇顶会论文的经验分享

    背景 xff1a 最近半个月 xff0c 对之前发表的一篇顶会论文进行了修改 xff0c 并重新提交了 这篇论文是一篇计算机领域的A会文章 本篇文章主要对计算机领域论文写作及发表过程中的相关经验做一个总结 希望可以对研究生小白们有点用 刚刚
  • jQuery的md5加密插件及其它js md5加密代码

    jQuery MD5 hash algorithm function lt code gt Calculate the md5 hash of a String String md5 String str lt code gt Calcul
  • matlab双目相机标定校正_基于双目视觉的无人机避障算法(一)

    讲述在10月到12月所做的所有工作 对于一个无人机自主避障来说 xff0c 存在着以下流程 xff1a 感知 xff1a 障碍物检测 行人检测 目标检测SLAM xff1a 为无人机提供位置估计 xff0c 构建稀疏环境地图路径规划 xff
  • pdf文件显示白色

    主要原因是pdf默认关联应用 xff0c 在版本更替时出现了错误 xff0c 重新给pdf设置一下默认关联应用即可 window10步骤如下 xff1a 1 打开我的电脑 选择计算机 打开设置 2 点 应用 3 选择 默认应用 中的 按文件
  • mysql数据库想要保持固定条数数据的操作

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 限定数据库数据条数 xff1a SELECT FROM 表名 order by 字段 desc limit 条数 这样查询到的是倒数几条数据 xff0c 保证了最新的数据
  • Docker容器的创建、启动、和停止

    1 容器是独立运行的一个或一组应用 xff0c 及他们的运行环境 容器是Docker中的一个重要的概念 2 docker容器的启动有三种方式 a 交互方式 xff0c 基于镜像新建容器并启动 例如我们可以启动一个容器 xff0c 打印出当前

随机推荐