C - 如何使用extern变量

时间:2014-08-20 01:34:25

标签: c extern

我正在学习如何使用extern变量,我写了一个简单的程序来尝试它,但它似乎并没有起作用。我看了一些例子,但我不知道什么是错的。

这是我的代码:

globals.h

#ifndef GLOBALS_H_
#define GLOBALS_H_

extern int gval;

#endif /* GLOBALS_H_ */

的main.c

#include <stdio.h>
#include "globals.h"

int main() {
int gval = 4;
printf("1st value is: %i", gval);

printf("2nd value is: %i", modded());
}

modify.c

#include "globals.h"

int modded() {
return gval++;
}

错误似乎是gvalmodify.c未定义,但我无法理解。

5 个答案:

答案 0 :(得分:3)

就目前而言,您已在标头中声明了一个全局变量gval,并且您已在gval函数中使用本地定义的变量main()隐藏了该全局声明。这是合法的,但有时候(我很想说'偶尔'或'很少')意图是什么。如果你使用GCC,使用-Wshadow选项会警告你有关阴影的变量。影响全局变量通常是一个坏主意。

对代码的最简单修复是将gval的定义移到main()之外:

#include <stdio.h>
#include "globals.h"

int gval = 4;

int main(void)
{
    printf("1st value is: %i", gval);
    printf("2nd value is: %i", modded());
    return 0;
}

但是,您应该注意,虽然它将编译并运行,但打印的第二个值将与第一个值相同,因为modded()返回值的未修改版本。要查看效果,您需要:

#include "globals.h"

int modded(void)
{
    return ++gval;
}

如果是我的代码,modded()中会有globals.h的声明。根据C99和C11(旧的和当前的C标准),你不应该在没有原型的情况下调用函数。必要的是,最初的C89标准对该规则更为宽松;它必须是容纳预先存在的非标准代码。但是,对于21世纪编写的代码,在使用函数之前没有真正的借口可以在范围内使用原型。

答案 1 :(得分:2)

必须在某处定义全局外部变量,但在代码中,gval中的main是局部变量,没有全局变量的定义。这一行

extern int gval;

声明,而非定义。换句话说,你必须有

int gval;

所有功能之外的某个地方。

即使定义了全局gval,请注意全局gval在本地gval范围内不可见

答案 2 :(得分:1)

将main.c更改为

#include <stdio.h>
#include "globals.h"

int gval; // define (allocate space for) the global variable

int main(void) {
    // int gval = 4; -- wrong -- this defines and initializes a local variable that hides the global of the same name
    gval = 4; // use the global variable, assigning to it ... or you could initialize it at the definition above and omit this line
    printf("1st value is: %i", gval);

    printf("2nd value is: %i", modded());
}

并将modded更改为

int modded(void) {
    // return gval++; -- wrong -- this is postfix increment and returns the value *before* incrementing
    return ++gval; // use prefix increment
}

您还应该有一个modify.h,其中包含您在main.c中包含的modded原型,或者只是在modded之前将main放在main.c中。

另一种方法是将modded更改为不返回值,因为它正在更改全局,因此:

void modgval(void) {
    ++gval; // or gval++
}

然后在主要:

    printf("1st value is: %i", gval);
    modgval();
    printf("2nd value is: %i", gval);

答案 3 :(得分:0)

这是一个简单的例子,描述了如何在源文件之间共享变量:

File 1:

  int GlobalVariable;         // explicit definition, this actually allocates as well as describing
  void SomeFunction(void);        // function prototype (declaration), assumes defined elsewhere, normally from include file.

  int main() {
    GlobalVariable = 1;
    SomeFunction();
    return 0;
  }

File 2:

  extern int GlobalVariable;  // implicit declaration, this only describes and assumes allocated elsewhere, normally from include

  void SomeFunction(void) {       // function header (definition)
    ++GlobalVariable;
  }

在此示例中,变量GlobalVariable在文件1中定义。为了在文件2中使用相同的变量,必须声明它。无论文件数量如何,全局变量只定义一次,但必须在包含定义的文件之外的任何文件中声明。

在你的情况下,main中的 gval 是一个局部变量,而是定义一个全局变量,然后使用extern在不同的源文件中共享变量。

答案 4 :(得分:0)

将Gval放在主声明之前,你准备好了;)