我正在学习如何使用extern变量,我写了一个简单的程序来尝试它,但它似乎并没有起作用。我看了一些例子,但我不知道什么是错的。
这是我的代码:
#ifndef GLOBALS_H_
#define GLOBALS_H_
extern int gval;
#endif /* GLOBALS_H_ */
#include <stdio.h>
#include "globals.h"
int main() {
int gval = 4;
printf("1st value is: %i", gval);
printf("2nd value is: %i", modded());
}
#include "globals.h"
int modded() {
return gval++;
}
错误似乎是gval
中modify.c
未定义,但我无法理解。
答案 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放在主声明之前,你准备好了;)