精华内容
下载资源
问答
  • C语言定义全局变量

    千次阅读 2016-04-18 09:49:51
    C语言定义全局变量时,在有多个.c/.h文件情况下发生了error LNK2005: "int abc"已经在 xxx.obj 中定义的错误 原因是定义时在头文件中定义了int abc,没有定义extern int abc。 后来定义了.h 中定义了extern int ...

    C语言定义全局变量时,在有多个.c/.h文件情况下发生了error LNK2005: "int abc"已经在 xxx.obj 中定义的错误

    原因是定义时在头文件中定义了int abc,没有定义extern int abc。

    后来定义了.h 中定义了extern int abc,但是在引用.h后没有在.c文件中写int abc,导致找不到abc。。。

    最终终于找到了方法,定义全局变量时要在一个.h中定义extern int abc,不要初始化,然后在某个需要的.c文件中写int abc = 0;或int abc(初始化或不初始化均可)。

    只能在一个.c文件中写,不然会重复定义。

    这样就OK啦。

    展开全文
  • C语言——全局变量定义与声明

    万次阅读 多人点赞 2019-09-28 12:31:34
    C语言全局变量定义与声明困扰着许多C语言初学者。本文讲述了全局变量定义与声明的用法,而且本为也将阐述这种用法的内在原理。我们先从两个错误例子引入,以下两个例程都在vc6.0平台上测试。 两种错误例程 1....

    转自:

    https://www.cnblogs.com/amanlikethis/p/3319744.html 

     

    C语言中全局变量的定义与声明困扰着许多C语言初学者。本文讲述了全局变量定义与声明的用法,而且本为也将阐述这种用法的内在原理。我们先从两个错误例子引入,以下两个例程都在vc6.0平台上测试。

    两种错误例程

    1.unresolved external symbol

    例子包含两个C文件(test.c)和(first.c)和一个头文件(test.h)。下边具体展示下它们的代码。

    test.h内容

    #ifndef _TEST_H
    #define _TEST_H
     
    extern int count;   
    
    #endif

    test.c内容

    #include <stdio.h>
    #include "test.h"
    extern void Fis_Cal(void);
    void main(void)
    {
     Fis_Cal();
      printf("the present value of count is %d\n",count);
    }

    first.c内容

    #include <stdio.h>
    #include "test.h"
    void Fis_Cal(void)
    {
     printf("the last value of count is %d\n",count);
     count = 1;
    }

    错误分析:test.h头文件中声明了全局变量count,但是在两个C文件中都没有对count进行定义,所以才会出现unresolved external symbol。

    一种解决方法:随便在两个C文件中加入一句“int count;”就OK了。例如我们加到test.c中,代码如下。 

    #include <stdio.h>
    #include "test.h"
    extern void Fis_Cal(void);
    int count;
    void main(void)
    {
     Fis_Cal();
     printf("the present value of count is %d\n",count);
    }

    说明:加入的“int count;”就是对count的定义,默认的将其初始化为0。

    结论:这种错误原因是“只声明未定义”。

    2.multiply defined symbols found

    还是如此,三个文件。但是,两个C文件与例程一中的文件一样,改动的只是头文件。

    test.h内容

    #ifndef _TEST_H
    #define _TEST_H
     
    int count; 
    
    #endif

    可以看到,与例程一仅仅差了一个“extern”关键词。

    错误分析:test.h头文件中定义了全局变量count,但是在两个C文件都通过“#include "test.h"”这句话对“int count;”进行了引用,所以造成了重复定义的错误。

    一种解决方法:添加一个“first.h”的头文件,并且更改first.c的内容,具体更改如下。

    first.h内容

    #ifndef _FIRST_H
    #define _FIRST_H
    
    extern int count;
    
    #endif

    first.c内容

    #include <stdio.h>
    #include "first.h"
    void Fis_Cal(void)
    {
     printf("the last value of count is %d\n",count);
     count = 1;
    }

    说明:经过这样的修改,原来的test.c中就包含了count的定义,而first.c中就包含了对count的声明,重复定义错误就得到解决。

    结论:这种错误原因是“多个C程序都包含了定义全局变量的头文件”。 

    原理分析

        我认为“int count;”是对全局变量的定义,而“extern int count”是对全局变量的声明,目的是让其他文件也使用这个全局变量。下边我们来挖掘全局变量的定义与声明的内涵。

        全局变量要么初始化(非零),要么没有初始化(为零)。非零时存储在程序中的data段,零时存储在程序的bss段。这谈了程序(.bin或者.hex)的结构。我再讲一下程序的启动,程序在启动(boot)过程中,通常都会运行一个叫bootloader的引导程序,这个引导程序干了很多事情,其中有一最重要的任务就是把程序(test段和rodata段)拷贝到内存,还包括data段的拷贝和bss段初始化。我们着重讲一下data段的拷贝和bss段初始化。

        我们的编译器会为我们定义的全局变量分配内存(地址),而且给我们的全局变量赋初值(写内存或清零),以后我们的程序就会根据需要来读这个全局变量(地址)或者修改这个全局变量(写内存)。初值为零时就在bss段,这个段初始化代码会将这部分清零。初值非零时,初始化代码会将全局变量的初值拷贝到data段。

        那么,显然全局变量的初值只有一个。我们程序中的全局变量的定义就是对全局变量分配内存并赋初值。而全局变量的声明是为了跨文件使用全局变量的需要,通过"extern"关键词来将全局变量引出。 

    顺便说一下C语言的存储类说明符,这能帮助我们加深理解。

    C语言的存储类说明符

         Auto 只在块内变量声明中被允许, 表示变量具有本地生存期。

         Extern 出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期, 连接程序知道其名字。

        Static 可以放在函数与变量声明中,在函数定义时,只用于指定函数名,而不将函数导出到链接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,总是表示定义的声明不导出到连接程序关键字。

    一种更好的声明与定义方式

    test.h内容 

    #ifndef _TEST_H
    #define _TEST_H
     
    #ifdef GLOBALS
    int count;
    #else
    extern int count;
    #endif 
    
    #endif

    test.c内容

    #define GLOBALS
    #include <stdio.h>
    #include "test.h"
    extern void Fis_Cal(void);
    void main(void)
    {
     Fis_Cal();
     printf("the present value of count is %d\n",count);
    }

    first.c内容

    #include <stdio.h>
    #include "test.h"
    void Fis_Cal(void)
    {
     printf("the last value of count is %d\n",count);
     count = 1;
    }

    说明:这种方法可以只定义一个头文件实现在不同C文件中分别实现定义与声明。“#define GLOBALS”只在当前定义的test.c文件中有效,所以在test.c中#include "test.h"预处理后,加入的是int count,而first.c中加入的"extern int count;"。其实还有一种书写方法,也能实现这个效果。

    test.h内容 

    #ifndef _TEST_H
    #define _TEST_H
     
    #ifdef GLOBALS
    #define EXT
    #else
    #define EXT extern
    #endif
    
    EXT int count;
    
    #endif

     

    展开全文
  • C语言全局变量定义方法

    万次阅读 多人点赞 2019-07-09 16:05:46
    C语言全局变量定义方法     今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义全局变量啊,但是先前怎么没错误?...

    C语言全局变量定义方法

        今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义过全局变量啊,但是先前怎么没错误?瞎折腾了一会最后还是发现问题出在细节上面了。以前只是侥幸没遇到而已。今天做个总结,以后再忘记了就回来直接查一下。

         我们都知道定义在函数外部的变量就叫做全局变量,但是通常只有一个C文件和一个H文件的时候那样定义是不会出问题的。一个大的系统会包含好多个.C文件和.H文件,每个.C文件都有可能会访问全局变量,所以全局变量在定义的时候就要稍微做下改变了。通常的做法是建立一个包含系统所有全局变量的.H文件,系统用到的所有全局变量都定义在该文件内,文件名可以用Global修饰一下。在该文件中定义某个全局变量的时候需要用extern声明该变量为外部变量。比如要定义SysEventCounter标志为unsigned char型的全局变量可以这样定义:

     

    extern unsigned char SysEventCounter; <----这里是关键,不能对该变量赋值,只能声明,赋值就会报错。

    上述声明是写在.H文件中的。其他.C文件若要用到该变量,直接包含该.H文件就可以了

     

    如果想要赋初值,可以在用到它的.C文件中这样写:

    unsigned char SysEventCounter = 0;

    不用赋初值时,直接

    unsigned char SysEventCounter;

    就可以了。注意:只需要在一个.C文件中写即可,其他.C文件直接可以用。如果在其他.C文件中也这样写会产生重复定义的错误。

    全局变量对变量的类型不限制,任何类型都可以,只要按照上述方法定义就不会有错误。


    展开全文
  • c语言全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用、赋值,想要定义它,一般将其定义在主函数main()之外就行。 例如下面的程序段,变量m就是一个全局变量定义在...

    c语言中全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用、赋值,想要定义它,一般将其定义在主函数main()之外就行。 例如下面的程序段,变量m就是一个全局变量,定义在主函数main()外面。

    c语言全局变量可声明什么?

    c语言全局变量的定义是什么?

    388b05b18b018266ebc8ddb3725e8b72.png

    C语言中,全局变量和外部变量有什么区别?

    全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。 其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。

    C语言头文件定义全局变量问题

    c语言,如何定义数组为全局变量?

    在C语言中,全局变量和函数声明及定义并列,也就是说,声明在最外层作用域的变量即为全局变 如在如下程序中 int i;int main(){int i_copy = i;i = 9;return 0;} int i就是一个全局变量,故在main函数中可以调用或修改i的值 所以。

    C语言中的全局变量的默认值

    就是那个全局变量在没有赋值前的值是多少呀?0吗?局部变量呢

    C语言中的全局变量的默认值: #include #include usingnamespacestd; inta; charb; floatc; doubled; boolboo; stringstr; int*e; char*f; float*g; double*h; string*s; intmain(){ cout这世界上一定会有一朵神奇的花,为小编的梦想而绽放

    在C语言中,全局变量的存储类别是?

    全局变量的存储类别是静态存储区。 变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。 全局变量既可以是某对象函数创建。

    C/C++中定义全局变量的几种方法及区别

    内置类型如果没有InitValue那么会初始化为0。

    类类型 InitValue可以是构造函数调用,也可以是能够隐式转换为Type类型的值。

    展开全文
  • C语言中全局变量与局部变量的区别是什么呢?我们怎么定义全局变量与局部变量呢。
  • C语言全局变量定义及重复包含问题  C语言中一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件中,同时在与之对应的fileName.h文件中进行 extern int A声明。当一个全局变量int A仅在fileName...
  • C语言全局变量与局部变量
  • c语言全局变量定义

    千次阅读 2017-06-28 08:00:50
    在同一个项目下含有多个cpp文件和头文件,如所有文件均将其头文件放入"stdafx.h",且cpp均包含#include "stdafx.h",需将全局变量前面加上extern,否则出现重定义
  • 好久没写C语言了,突然忘记怎么定义全局共享变量了,由于老项目的Code Base都是C的风格,其中又大量用了全局变量,只能跟着糊一坨shit上去了。没办法。再共享全局变量的global_shared_var.h文件中写入:extern int ...
  • C语言定义全局变量

    2016-12-27 20:06:00
    (1)在C语言的头文件中定义变量出现的问题... #endif那么,很糟糕的是,这里的int A是个全局变量定义,所以如果这个头文件被多次引用的话,你的A会被重复定义,显然语法上错了。只不过有了这个#ifndef的条件编译...
  • C语言extern全局变量避免重复定义

    千次阅读 2019-08-07 10:43:57
    在example.c中 int a = 0; 在example.h中 extern int a; 然后其他c文件#include "example.h"就可以了。
  • 匿名用户1级2014-12-29 回答结构的定义用户定义自己所需要的结构型,可以...定义结构型变量方法有三种,在定义的同时,可以给变量的每个成员赋初值。1. 先定义结构型,后定义变量例如:12345678structstudent{long...
  • C语言头文件定义全局变量问题

    千次阅读 2017-03-24 10:23:30
    正确的作法是在c源文件中定义一个全局变量,在头文件中加入全局变量的声明,在外部文件调用的时候,包含其头文件,加入全局变量的声明(不加也是可以的,最好加上)。 //1.c int a; //1.h...
  • C语言全局变量

    2020-01-04 23:33:31
    文章目录1、多个文件中使用全局变量2、本文件中...a.c中定义全局变量 int a=100 b.c中使用a.c中定义的全局变量 #include <stdio.h> extern int a; //声明全局变量已在其它地方进行了定义 int main() { ...
  • 好久没写C语言了,突然忘记怎么定义全局共享变量了,由于老项目的Code Base都是C的风格,其中又大量用了全局变量,只能跟着糊一坨shit上去了。没办法。 再共享全局变量的global_shared_var.h文件中写入: extern...
  • 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, ... 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使
  • 今天小编就为大家分享一篇关于C语言定义结合全局变量方法实现单片机串口透传模式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 1、全局变量 定义:在所有函数外部定义的变量cheng
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 全局变量、全局静态变量、局部变量、局部静态变量区别
  • 2、全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。 全局变量和局部变量的作用域(特殊情况) 1、全局变量的有效范围为定义处到源文件...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: ...当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 2>静态局部变量具有局部作用域
  • C语言在头文件定义全局变量的技巧

    千次阅读 2020-05-01 12:48:42
    在刚开始学习C语言的时候,可能很多人都听过前辈说要少用goto,少用do{}while(),不要在头文件定义全局变量等,但实际上每个特性都有其合适的应用场合,只要正确的使用是不会有问题的,相反还可能给代码带来好处。
  • PAGE / NUMPAGES 头文件定义全局变量等问题 ?全局变量可不可以定义在可被多个.C文件包含的头文件中为什么 可以在不同的C文件中以static形式来声明同名全局变量头文件中不可以直接定义变量和函数但是可以定义static...
  • 在C++中定义全局变量是应该尽量在。cpp文件中定义,而不要在。h 文件中 定义,定义好了之后,可以在。h文件中利用 extern关键字进行 声明。如果在。h文件中定义的话,多层包含可能会引起重复定义的错误。下面是一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,982
精华内容 45,992
关键字:

c语言定义全局变量的方法

c语言 订阅