全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

2024-04-11 00:32

本文主要是介绍全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?   

     

    答:可以,在不同的C文件中以static形式来声明同名全局变量。   可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.    

     

     

    -------1. 请高手用VC举个例子.

           2. 如何在不同的C文件中以static形式来声明同名全局变量?

答案

  • 2008年7月22日 7:58
    Jimt200010 的头像
    Jimt200010
    2,495
    已答复
    登录进行投票
    0
    登录进行投票

    全局变量可不可以  定义在  可被多个.C文件包含的  头文件中  ?为什么?

     

    答:可以,extern 和 static 都行,但有一点需要注意,看例子

     

    我们有一个 global.h 文件和三个 c 文件

     

     

    Code Snippet

    // global.h ,注意这里绝对不能赋初值

    static int g_current;

    extern int g_count;

     

     

     

    Code Snippet

    // a.c

    #include global.h

     

    void func1()

    {

      g_current++;

      g_count = 3;

    }

     

    // 主入口,这里无关紧要

    int main()

    {

      return 0

    }

     

     

     

    Code Snippet

    // b.c

    #include global.h

     

    void func2()

    {

      g_current++;

      g_count = 5;

    }

     

     

     

    Code Snippet

    // c.c

    #include global.h

     

    void func3()

    {

      g_current--;

      g_count = 11;

    }

     

     

    这样的话三个c文件就是公用这两个全局变量了。但还有一些问题:

    对于 extern int g_count  编译不通过,因为大家都是 extern,没有一个是实体

    对于 static int g_current 编译可以通过,但逻辑不对,因为没有初始化,这个static变量就没有任何意义了

     

    所以实际使用中需要对其中的任何一个c文件做一下改进,比如入口函数所在的 a.c

     

    Code Snippet

    // a.c

    #include global.h

     

    int g_count;  // 这里才是真正的定义,其他地方的都是引用这里的

                  // 虽然这里也在h中声明了一次extern,但没有影响

     

    void func1()

    {

      g_current++;

      g_count = 3;

    }

     

    // 主入口,这里无关紧要

    int main()

    {

      g_current = 0;  // 对static变量初始化。由于无法在定义时做,那么就在入口函数里完成好了。

      return 0

    }

     

     

    之后编译运行都正常。

    原文地址: http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/5ed926a7-5572-440e-bd20-e387690f5c43/

这篇关于全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892587

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

ispunct函数讲解 <ctype.h>头文件函数

目录 1.头文件函数 2.ispunct函数使用  小心!VS2022不可直接接触,否则..!没有这个必要,方源一把抓住VS2022,顷刻 炼化! 1.头文件函数 以上函数都需要包括头文件<ctype.h> ,其中包括 ispunct 函数 #include<ctype.h> 2.ispunct函数使用 简述: ispunct函数一种判断字符是否为标点符号的函

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

解决C/C++ 头文件相互包含 问题的方法

所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。 类A和类B需要彼此互相引用,这样必然有一个类会先被定义,而另外一个类后被定义,这样在 先被定义的类引用后被定义的类的时候,就导致了所谓的超前引用。 超前引用导致的错误有以下几种处理办法:   1) 使用类声明    在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

c++ 定义二位数组

在 C++ 中,定义二维数组有几种常见的方式。以下是几个示例: 1. 静态二维数组 定义: int array[3][4]; 这里,array 是一个 3 行 4 列的整数二维数组。 初始化: int array[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; 2. 动态二维数组 使用指针和动态内存分配: 定义:

C# 如何同时Ping多个IP地址

在C#中,如果需要同时ping多个IP地址,可以采用多线程或异步编程的方式来实现,以便可以同时进行多个ping操作。以下是两种常用的方法: 方法一:使用多线程(Task 或 Thread) 使用Task是更现代和推荐的方式,因为它内置了更好的线程管理和异常处理机制。以下是一个使用Task的示例,展示如何同时ping多个IP地址: using System; using System.Co