精华内容
下载资源
问答
  • 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啦。

    展开全文
  • 修饰对象:全局变量、函数作用:1、提示编译器在其他模块或者其他文件中查找该变量、函数的定义2、可以引用定义在其他文件中的全局变量和函数用法:先声明,再初始化,后调用。1、声明形式:声明时要严格对应声明...

    修饰对象:全局变量、函数

    作用:

    1、提示编译器在其他模块或者其他文件中查找该变量、函数的定义

    2、可以引用定义在其他文件中的全局变量和函数

    用法:先声明,再初始化,后调用。

    1、声明形式:声明时要严格对应声明类型,变量对变量、数组对数组、指针对指针、函数对函数

    1)extern + 变量类型 + 变量名            例子: extern int name;

    2)extern + 函数返回值类型 + 函数名 例子: extern void func();

    3)extern + 数组类型 + 数组名称                              例子: extern char arr[];

    2、初始化:在被引用文件(原文件)中初始化,如果没有初始化,编译器自动初始化为0。

    3、调用:直接使用变量名、函数名

    1)例子: name = 2;

    2)例子: func();

    近义用法:

    引用头文件。把需要引用的全局变量放到被引用文件(原文件)的头文件声明,在引用文件(引用外部变量的文件)抬头添加语句

    include "*.h"

    区别:

    引用头文件的方法:可以引用原文件的变量和函数。

    extern修饰的方法:仅引用原文件中特定的变量和函数。

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

    C语言中全局变量的定义及重复包含问题

    C语言中一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件中,同时在与之对应的fileName.h文件中进行 extern int A声明。当一个全局变量int A仅在fileName.c文件中定义而未在相对应的头文件fileName.h声明时,包含与之相应的fileName.h文件时编译器会出现未定义的错误,其原因是编译器在fileName.h里面找不到该变量的说明。如:

    例1

    /*file1.h*/

    #ifndef _ FILE1_H

    #define _FILE1_H

    /*…………………*/

    #endif

    /*file1.c*/

    int A=0;

    /*main.c*/

    #include “file1.h”

    int main(int argc,char** argv){

    A=123;

    return0;

    }

    此时编译器在预处理的时候会把整个file1.h文件在#include “file1.h”处展开。当读到A=123的时候在file1.h查找不到有关A的声明或定义,所以会报“未声明标识符A”的错误。

    那么如果直接将全局变量直接定义在头文件中,此时编译器会识别到变量A吗?答案是肯定的。但是为什么没有人这么做呢?那就看看在将全局变量定义在头文件中会发生什么事情?

    例2:

    假设有头文件fileA.h  源文件fileA.c    main.c

    /*fileA.h*/

    #ifndef _FILE_A_H

    #define _FILE_A_H

    int gva =123;

    #endif

    /*fileA.c*/

    #include “fileA.h”

    /*…………..*/

    /*main.c*/

    #include

    #include

    #include “fileA.h”

    int main(int argc,char** argv){

    gva=456;

    return 0;

    }

    开始编译,这时会发现编译器报错了:提示为:“main.obj: error LNK2005: _gva已经在fileA.obj中定义,fatalerror LNK1169:找到一个或多个多重定义的符号”。可是明明已经做了避免重复包含的处理,为什么会出现这种情况呢?原因在于C语言编译的时候首先会进行单个.c文件的编译,然后再进行连接。避免重复包含只能保证在单个.c编译的时候不被重复编译,而不能保证多个.c编译的时候不会被重复编译。什么意思?以上面的代码为例,如果另有头文件B.h和C.h其中B.h里面有

    #include “fileA.h”

    C.h里面有

    #include “B.h”

    #include  “fileA.h”

    上面提到过#include 是在预处理的时候将该头文件在当前位置展开,此时在编译C.c文件的时候,编译的时候会先将#include “B.h”代码段展开编译,而B.h里面包了fileA.h所以fileA.h已经编译了,此时_FILE_A_H的值已经为1,当展开#include “fileA.h” 时因为_FILE_A_H已经定义,所以会自动跳过#endif处,避免重复包含的预算理起了作用,会跳到#endif处。

    回到 例2 因为单个.c文件的编译是独立进行的,首先编译fileA.c 到fileA.obj。然后编译main.c 到main.obj。此时的编译是没有问题的,接下来进行目标文件链接,此时编译器就会发现fileA.obj中为变量vga分配了内存空间,而在main.obj中也为vga分配了内存空间。这时变量 vga就有两个不同的变量地址,编译器不知道该哪个才是gva的地址。

    为什么有的人在头文件中使用了static 后会顺利通过编译呢。static关键字修饰的变量会延长其生存周期,但是也限定在该变量只在当前文件中可见,相当于在编译的时候又定义了一个新的变量而变量名相同而已(类似于两个函数内的局部变量关系,只作用于当前函数)。所以严格意义来说static 修饰的变量尽管定义在函数外面但不能算是全局变量。

    展开全文
  • 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

     

    展开全文
  • 转自:htmlC语言中全局变量定义与声明困扰着许多C语言初学者。本文讲述了全局变量定义与声明的用法,并且本为也将阐述这种用法的内在原理。咱们先从两个错误例子引入,如下两个例程都在vc6.0平台上测试。测试两种...
  • C语言中全局变量与局部变量的区别是什么呢?我们怎么定义全局变量与局部变量呢。
  • 学习了C语言全局变量,变量,常量的使用方式之后。自主进行了测试,并将一些注意点记录下来,巩固记忆并方面查阅代码:#include #include /*这个程序用来测试全局变量,常量的定义与使用*///定义常量PI=3.14#...
  • 好久没写C语言了,突然忘记怎么定义全局共享变量了,由于老项目的Code Base都是C的风格,其中又大量用了全局变量,只能跟着糊一坨shit上去了。没办法。再共享全局变量的global_shared_var.h文件中写入:extern int ...
  • c语言全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用、赋值,想要定义它,一般将其定义在主函数main()之外就行。 例如下面的程序段,变量m就是一个全局变量定义在...
  • C语言全局变量定义及重复包含问题  C语言中一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件中,同时在与之对应的fileName.h文件中进行 extern int A声明。当一个全局变量int A仅在fileName...
  • 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, ... 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使
  • 1、定义在函数外的变量—全局变量 1>生存期、作用域为全局! 2>所有的函数都可以使用、访问。 2、全局变量的初始化: 1>没有做初始化的全局变量编译器会自动为它分配0值。(而本地变量是随机的一个值!...
  • 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...
  • 从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的 可以有静态存储变量和动态存储变量之分。一。全局变量和局部变量1。局部变量他是指在函数内部定义的变量 作用域为定义局部变量的函数 也就是说...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 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语言定义全局变量

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

    2021-06-23 21:38:54
    //定义全局变量max,min int main() { float average(float array[10]);//函数声明 float ave,score[10]; int i; printf(“输入学生成绩:”); for(i=0;i<10;i++) scanf("%f",&score[i]); a
  • 全局大肠穴的定位 显著性检验结果P值越小,变量表示否定原假设所犯错误越小。 语言源义的用域二人上马的功效具有 直线回归反映两变量间的依存关系,程序而直线相关反映两变量间的相互直线关系。 溶栓治疗有效的...
  • 全局变量的范围:从定义全局变量的位置开始到本源文件结束 局部变量的范围:一般来说,在函数内部定义的变量只在本函数范围内有效;在符合语句内定义的变量只在本复合语句内有效; 代码: # include<s...
  • 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...
  • 在单片机编程中经常会用到全局变量,假设要在a.c文件中用到b.c文件定义的变量,我们应该怎样定义、怎样引用才能让程序看起来干净整洁呢?下面简单记录一下假设现在有3个c文件,a.c、b.c、main.c;2个头文件,a.h,b....
  • C语言全局变量定义方法

    万次阅读 多人点赞 2019-07-09 16:05:46
    C语言全局变量定义方法     今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义全局变量啊,但是先前怎么没错误?...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: ...当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 2>局部变量也只有局部作用域,它是自动对象(a
  • 1、全局变量 定义:在所有函数外部定义的变量cheng

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,578
精华内容 1,831
关键字:

c语言定义全局变量

c语言 订阅