如何引用一个已经定义过的全局变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何引用一个已经定义过的全局变量相关的知识,希望对你有一定的参考价值。

答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误fu1.h:[cpp] view plaincopyprint?#ifndef FF1_h #define FF1_h #include<stdio.h> void setone(); #endif #ifndef FF1_h#define FF1_h#include<stdio.h>void setone();#endiffu1.c:[cpp] view plaincopyprint?#include"fu1.h" int i; void setone() printf("%d/n", i); #include"fu1.h"int i;void setone()printf("%d/n", i);fu2.h[cpp] view plaincopyprint?#ifndef FF2_h #define FF2_h #include<stdio.h> void settwo(); #endif #ifndef FF2_h#define FF2_h#include<stdio.h>void settwo();#endiffu2.c[cpp] view plaincopyprint?#include"fu2.h" int i; void settwo() printf("%d/n", i); #include"fu2.h"int i;void settwo()printf("%d/n", i);test.c[cpp] view plaincopyprint?#include"fu1.h" #include"fu2.h" int i=36; int main(void) printf("%d/n", i); i =3; setone(); i = 6; settwo(); #include"fu1.h"#include"fu2.h"int i=36;int main(void)printf("%d/n", i);i =3;setone();i = 6;settwo();运行结果:3636fu1.h[cpp] view plaincopyprint?#ifndef FF1_h #define FF1_h #include<stdio.h> void setone(); #endif #ifndef FF1_h#define FF1_h#include<stdio.h>void setone();#endiffu1.c[cpp] view plaincopyprint?#include"fu1.h" int i= 86; void setone() printf("%d/n", i); #include"fu1.h"int i= 86;void setone()printf("%d/n", i);test.c[cpp] view plaincopyprint?#include<stdio.h> extern int i; int main(void) printf("%d/n", i); i =3; printf("%d/n", i); setone(); #include<stdio.h>extern int i;int main(void)printf("%d/n", i);i =3;printf("%d/n", i);setone();运行结果:8633fu1.h[cpp] view plaincopyprint?#ifndef FF1_h #define FF1_h #include<stdio.h> #include<stdlib.h> void setone(); #endif #ifndef FF1_h#define FF1_h#include<stdio.h>#include<stdlib.h>void setone();#endiffu1.c[cpp] view plaincopyprint?#include"fu1.h" static int i; void setone() printf("%d/n", i); #include"fu1.h"static int i;void setone()printf("%d/n", i);fu2.h[cpp] view plaincopyprint?#ifndef FF2_h #define FF2_h #include<stdio.h> #include<stdlib.h> void settwo(); #endif #ifndef FF2_h#define FF2_h#include<stdio.h>#include<stdlib.h>void settwo();#endiffu2.c[cpp] view plaincopyprint?#include"fu2.h" static int i; void settwo() printf("%d/n", i); #include"fu2.h"static int i;void settwo()printf("%d/n", i);test.c 参考技术A   可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
可以用引用头文件的方式,也可以用extern关键字的方式来引用定义过的全局变量
如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错。

如何引用与 C++ 中的局部变量同名的全局变量?

【中文标题】如何引用与 C++ 中的局部变量同名的全局变量?【英文标题】:How to refer to a global variable which has the same name as a local variable in C++? 【发布时间】:2014-04-24 21:33:50 【问题描述】:

如果有一个全局变量并且函数有一个同名的参数,并且期望的结果是局部变量和全局变量之和,那么在这种特殊情况下我们如何引用全局函数?我知道这样做不是个好主意。但只是出于好奇。

int foo = 100;

int bar(int foo)

    int sum=foo+foo; // sum adds local variable and a global variable
    return sum;


int main()

    int result = bar(12);
    return 0;

【问题讨论】:

如果它被遮蔽,它被遮蔽:( ... ::foo 是全局 foo,不是吗? 这就是我想弄清楚的,我们可以让函数的参数与全局变量的参数同名吗? ideone.com/d8Cc1c 【参考方案1】:

到目前为止,最好的选择是重命名函数参数,使其不与全局变量冲突,因此无需规避。

假设重命名选项不可接受,使用::foo 在全局范围内引用foo

#include <iostream>

int foo = 100;

int bar(int foo)

    int sum = foo + ::foo; // sum adds local variable and a global variable
    return sum;


int main()

    int result = bar(12);
    cout << result << "\n";
    return 0;

本地名称和全局名称之间的冲突是不好的——它们会导致混淆——因此值得避免它们。您可以使用 GCC 的 -Wshadow 选项(g++,对于 C 代码使用 gcc)来报告阴影声明的问题;与-Werror 一起,它会停止代码编译。

【讨论】:

【参考方案2】:

使用::foo - 但真的不要那样做。它会让每个人都感到困惑,你真的不应该做那些事情。相反,重命名一个或另一个变量。使用:: 前缀来解决这个问题是一个可怕的想法。

【讨论】:

我知道这很糟糕,但我只是在挑选逻辑。

以上是关于如何引用一个已经定义过的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

C笔试题之简答题

如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量

解释啥是全局变量,如何定义

c语言工程里其它文件引用全局变量?

jmeter设置全局变量踩过的坑

c语言一个结构体如何在多个源文件里面调用?