精华内容
下载资源
问答
  • 2021-05-18 14:19:15

    extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

    另外,extern也可用来进行链接指定。

    extern 变量

    在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a; 请问,这样可以吗? 答案与分析: 1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。 2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 (数组的起始地址),而*a是重新定义了一个指针变量a的地址可能是0x87654321,直接使用*a是错误的. 3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。 4)、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。

    函数

    extern 函数1 常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用? 答案与分析: 如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别: extern int f(); 和int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。 extern 函数2 当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会照成系统错误,这种情况应该如何解决? 答案与分析: 目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。 宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。 extern “C” 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢? 答案与分析: C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。 下面是一个标准的写法: //在.h文件的头上 #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ … … //.h文件结束的地方 #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */

    参考资料:baike.baidu.com/view/963932.htm?fr=ala0_1_1

    更多相关内容
  • C语言中如何使用全局变量简单示例,多文件.c如何使用全局变量 关注“M2嵌入式”公众号,回复资源免费下载
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有...
  • #include int max; int min; float getnuber(int sorce[],int size) { int i; int sum =0; max = min =sorce[0]; for(i=0;i;i++){ sum+= sorce[i]; if(max[i]){ max =sorce[i];... } ```c 这里插入代码片
    #include <stdio.h>
    int max;
    int min;
    float getnuber(int sorce[],int size)
    {
    	int i;
    	int sum =0;
    	max = min =sorce[0];
    	for(i=0;i<size;i++){
    		sum+= sorce[i];
    		if(max<sorce[i]){
    			max =sorce[i];
    		}
    		if(min>sorce[i]){
    			min =sorce[i];
    		}
    	}
    	return	(float)sum/size;
    }
    int main()
    {
    	int sorce[] ={12,233,133,46,6,64,66};
    	int size;
    	float aregve;
    	size = sizeof(sorce)/sizeof(sorce[0]);
    	aregve = getnuber(sorce,size);
    	printf("平均成绩为%.2f,最大值%d,最小值:%d",aregve,max,min);
    	return 0;
    }
    
    ```c
    在这里插入代码片
    
    
    
    展开全文
  • C语言 全局变量和局部变量详解 核心内容: 1、局部变量和全局变量 变量按照作用域分为:全局变量和局部变量 全局变量的作用域:从定义位置开始到下面整个程序结束。 局部变量的作用域:一个函数内部定义的...
  • 满意答案lyia60292015.10.07采纳率:41%等级:8已帮助:114人分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但实际教学过程应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序...

    满意答案

    02ae427d08e371d7e90d5b995e828d6d.png

    lyia6029

    2015.10.07

    02ae427d08e371d7e90d5b995e828d6d.png

    采纳率:41%    等级:8

    已帮助:114人

    分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。

    实例:编写函数求3个数中的最大值与最小值。

    方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:

    #include "stdio.h"

    #include "conio.h"

    int max,min;/*定义两个全局变量用于保存函数返回值*/ void max_min(int a,int b,int c) /*定义求最大最小值的函数*/ {max=min=a; /*初始化最大最小值*/
    if(max if(max if(min>b)min=b; if(min>c)min=c; }

    main() {int x,y,z;
    printf(" 请输入3个整数:

    "); scanf("%d,%d,%d",&x,&y,&z);
    max_min(x,y,z) /*调用求最大值与最小值的函数*/
    printf("三个数中的最大值为:%d;最小值为:%d",max,min);/*输出最大值与最小值*/
    getch(); }

    01分享举报

    展开全文
  • c语言中如何避免过多使用全局变量

    千次阅读 2020-11-10 22:19:33
    文章目录1、设计函数以传递指针类型的参数2、定义一个函数以获取/设置全局变量,利用static变量,将全局变量作用域限定于该函数,将全局变量隐藏起来3、把全局变量定义某一个 .c 文件, 并定义为 static类型,...

    1、设计函数以传递指针类型的参数

      全局变量满天飞的代码:

    typedef struct MotionParameters
    {
    	float a;
    	float b;
    	float c;
    }MP;
    MP g_MPData;
    
    void fun0(void)
    {
    	g_MPData.a = 0;
    }
    void fun1(void)
    {
    	g_MPData.b = 1;
    	fun0();
    }
    void fun2(void)
    {
    	g_MPData.c = 2;
    	fun1();
    }
    void main(void)
    {
    	fun2();
    }
    

      设计函数以传递指针类型的参数,无需使用全局变量:

    typedef struct MotionParameters
    {
    	float a;
    	float b;
    	float c;
    }MP;
    
    void fun0(MP *p)
    {
    	p->a = 0;
    }
    void fun1(MP *p)
    {
    	p->b = 1;
    	fun0(p);
    }
    void fun2(MP *p)
    {
    	p->c = 2;
    	fun1(p);
    }
    void main(void)
    {
    	MP MPData;
    	fun2(&MPData);
    }
    

    2、 定义一个函数以获取/设置静态局部变量,其作用域限定于该函数,实现类似全局变量的效果,将全局变量隐藏起来

    3、在一个.c文件里定义静态全局变量,其作用域限定于该文件,在该文件下定义初始化/获取/设置该静态全局变量的函数,在对应的.h文件里对初始化、获取、设置函数进行声明,实现类似全局变量的效果,将全局变量隐藏起来

      方法2,3的源代码如下:
      globals.h定义SET/GET宏及对初始化、获取、设置函数的声明。

    #ifndef _H_GLOBALS_H
    #define _H_GLOBALS_H
    
    #define SET 1
    #define GET 0
    typedef struct MotionParams
    {
    	float a;
    	float b[2];
    }MP;
    
    void initial_xxx(void);
    MP *get_or_set_xxx(MP* p, int flag);
    
    void init_motion_params(void);
    MP *get_motion_params(void);
    void set_motion_params(MP* p);
    
    #endif
    

      globals.c定义静态全局变量,定义初始化、获取、设置静态局部变量/静态全局变量的函数。

    #include <memory.h>
    #include "globals.h"
    
    //初始化值
    void initial_xxx(void)
    {
    	MP MPDataTemp; //临时结构体,如果结构体较大时,可以考虑用malloc创建一个
    
    	MPDataTemp.a = 0.0;
    	MPDataTemp.b[0] = 0.0;
    	MPDataTemp.b[1] = 0.0;
    	get_or_set_xxx(&MPDataTemp, SET);
    }
    
    //获取或设置值
    //(1)形参用结构体指针,可以有效避免分配过大的栈空间导致栈溢出(结构体有可能很大)
    MP *get_or_set_xxx(MP* p, int flag)
    {
    	static MP s_MPData;  //静态局部变量,作用域只在本函数,存储于全局数据区,内存空间较栈空间大得多
    
    	if (flag == SET)
    	{
    		memcpy(&s_MPData, p, sizeof(MP));
    	}
    	return &s_MPData;
    }
    
    
    static MP sg_MPData;//静态全局变量,作用域只在本文件
    
    //初始化值
    void init_motion_params(void)
    {
    	sg_MPData.a = 0.0;
    	sg_MPData.b[0] = 0.0;
    	sg_MPData.b[1] = 0.0;
    }
    
    //获取值
    MP *get_motion_params(void)
    {
    	return &sg_MPData;
    }
    
    //设置值
    //(1)形参用结构体指针,可以有效避免分配过大的栈空间导致栈溢出(结构体有可能很大)
    void set_motion_params(MP* p)
    {
    	memcpy(&sg_MPData, p, sizeof(MP));
    }
    
    

      test.c用于测试:
      (1)静态局部变量+init/set/get函数实现类似全局变量功能
      (2)静态全局变量+init/set/get函数实现类似全局变量功能

    #include <stdlib.h>
    #include <memory.h>
    #include "globals.h"
    
    void main(void)
    {
    	MP MPData, MPData2, *p = NULL;
    
    	//(1)静态局部变量+init/set/get函数实现类似全局变量功能
    	initial_xxx();
    
    	MPData.a = 1.0;
    	MPData.b[0] = 2.0;
    	MPData.b[1] = 3.0;
    	get_or_set_xxx(&MPData, SET);
    
    	memcpy(&MPData2, get_or_set_xxx(NULL, GET), sizeof(MP));  //将静态局部结构体拷贝
    	//p = get_or_set_xxx(NULL, GET);  //指针操作可以直接修改静态局部结构体的变量,不好管理(修改静态局部结构体的变量只通过函数get_or_set_xxx),所以不采用此方式
    
    
    	//(2)静态全局变量+init/set/get函数实现类似全局变量功能
    	init_motion_params();
    
    	memcpy(&MPData, get_motion_params(), sizeof(MP));  //将静态全局结构体拷贝
    
    	MPData.a = 4.0;
    	MPData.b[0] = 5.0;
    	MPData.b[1] = 6.0;
    
    	set_motion_params(&MPData);
    
    	memcpy(&MPData2, get_motion_params(), sizeof(MP));
    	// p = get_motion_params(); //指针操作可以直接修改静态全局结构体的变量,不好管理(修改静态全局结构体的变量只通过函数set_motion_params),所以不采用此方式
    }
    

      相关参考资料:
    1.结构体直接赋值的实现
    2.为何不建议使用全局变量
    3.代码规范——全局变量使用规范

    展开全文
  • 要用全局变量,需要使用”::” 局部变量可以与全局变量同名,函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,同一个函数内可以定义多个同名的局部变量,比如两个循环...
  • 今天小编就为大家分享一篇关于C语言宏定义结合全局变量的方法实现单片机串口透传模式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • c语言中的局部变量和全局变量

    千次阅读 2021-08-05 22:52:14
    我们按照变量的作用域范围可以把变量划分为局部变量和全局变量; 局部变量 局部变量出现三种地方: (1)函数的开头定义的变量 (2) 函数内的复合语句内定义的变量 (3)形式参数 一个函数内部定义的变量只...
  • 声明:突然看到这篇文章,发现了c语言中使用全局变量的错误,特转之。首先看一段代码(https://gist.github.com/3760736)func.cintbuf=0;voidfunc(){buf=2;/* Do something else */}view raw func.c This Gistbrought...
  • 通常情况下,都是C文件定义全局变量头文件声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义头文件里面会方便很多,那到底是如何实现的?os_var.c文件内容1 #define OS...
  • C语言-合理使用全局变量

    千次阅读 2020-04-14 23:17:37
    C语言-合理使用全局变量 全局变量 所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件 缺点 全局变量存在周周期长,将会占用更多的内存...
  • C语言在头文件定义全局变量

    千次阅读 2021-05-20 12:57:40
    C语言在头文件定义全局变量头文件定义全局变量等问题全局变量可不可以定义可被多个.C文件包含的头文件?为什么?可以,不同的C文件以static形式来声明同名全局变量。头文件不可以直接定义变量和函数,...
  • C语言全局变量使用

    2022-01-28 20:27:18
    我们看到.c文件,定义了 uint8_t color_light_on=0; .h文件使用了外部声明extern extern uint8_t color_light_on; 使用 声明了.h color_light_on=1;
  • C语言全局变量

    千次阅读 2022-04-05 15:56:37
    C语言全局变量 1、函数里面定义的变量称为局部变量,函数外面定义的变量称为外部变量,也称为全局变量。 2、若函数的内部存在一个与全局变量同名的局部变量,南无编译器不会报错,而是用局部变量来覆盖...
  • C语言中 static 的用法全局变量与局部变量 1. 什么是static? static 是 C语言中很常用的修饰符,它被用来控制变量的存储方式和可见性。 1.1 static 的引入 函数内部定义的变量,当程序执行到它的定义处时,编译器...
  • 在C语言的学习过程,会涉及到**局部变量和全局变量的内存分配和内存释放**问题
  • C语言 跨文件调用全局变量

    千次阅读 2021-12-07 12:02:29
    使用头文件. 1.c int var; 添加#include “1.h” 1.h extern int var; 2.c 添加 #include “1.h”
  • 多文件中C语言中全局变量的重定义

    千次阅读 多人点赞 2022-04-18 13:04:50
    上述结果是我们 VS2019下测试的, Linux 链接器处理多重定义的符号的规则为: 不允许有多个同名的强符号 如果有一个强符号和多个弱符号同名,选择强符号 如果有多个弱符号同名,则从这些弱符号随机选择一个 ...
  • 如何在c语言中定义及引用全局变量?答案:5信息版本:手机版解决时间 2019-10-03 10:30已解决2019-10-02 15:19如何在c语言中定义及引用全局...函数中使用全局变量,一般应作全局变量说明。只有函数内经过说明的...
  • 1,使用全局变量会占用更多的内存(因为其生命期长),不过计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。 2,使用全局变量程序运行时速度更快一些(因为内存...
  • 在C语言当中,定义函数之外的变量称为全局变量(包括main函数),而定义函数内部的变量我们称之为局部变量,这里需要注意的是main函数内部的变量也是局部变量。 说到变量,我们就不能不说变量作用域,变量的生命...
  • 在C语言中使用extern 关键字来定义全局变量的时候,我们需要.h文件和.c文件中重复定义,这种重复,导致了出错几率的增加。 今天,整理自己的代码的时候,考虑到我写的代码从一至终都是一个cpp文件里面。于是,...
  • 本文主要是对c语言全局变量和局部变量进行了问题汇总。
  • 局部变量和全局变量是很多初学者都容易轻视的一...全局变量在整个生命周期内都是有效的,定义位置之后的任意函数都能访问 局部变量是指函数内部定义的变量 现在我们就从几个方面来介绍一下它们有什么区别 存储
  • 我已经阅读了墙上的文字,避免全球.这导致了一个显而易见的问题,如何最好地做到这一点?我显然想用当前的项目来...微创,不需要其他人的代码改装.所以我拼凑了一个小的UDP套接字阅读器,它使用setup()函数打开并绑...
  • 1)主函数中定义的变量也只能主函数中使用,不能其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。 2)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,028
精华内容 63,611
关键字:

在c语言中最好使用全局变量