我理解extern的方式是我们能够在程序中的任何地方声明变量并使用它,但我们可以只定义一次。我在以下程序中收到错误。
的hello.c
#include <stdio.h>
#include "function.h"
extern int c;
int main()
{
int c;
c=10;
printf("%d\n",c);
printExternValue();
return 0;
}
功能.h
void printExternValue();
功能.c
#include "function.h"
#include "stdio.h"
extern int c;
void printExternValue()
{
printf("%d\n",c);
}
我希望打印出这个程序:
10
10
但它没有这样做,因为它给出了一个错误。我在function.c文件中重新声明了变量c,目的是使用存储在所谓的外部存储器中的值。
错误:function.c :(。text + 0x6):未定义对`c'的引用
我目前正在阅读教程点的PDF文件,我认为这是非常多余的,因为使用聚合extern创建变量的意图是无用的。应该做的正确的方法是,他们定义函数外的变量是对的吗?
#include <stdio.h>
// Variable declaration:
extern int a, b;
extern int c;
extern float f;
int main ()
{
/* variable definition: */
int a, b;
int c;
float f;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
printf("value of c : %d \n", c);
f = 70.0/3.0;
printf("value of f : %f \n", f);
return 0;
}
答案 0 :(得分:1)
变量declread as
extern int c;
是外部声明,可能需要外部定义。 &#34;外部&#34;在这种情况下,意味着&#34;位于任何功能之外#34;。您在c
中本地声明的main()
未填写该角色。
由于您在代码中使用外部声明的变量c
,您必须定义并仅定义一次
你需要
int c;
或
int c = 0;
或
extern int c = 0;
它是您的一个实现文件,位于文件范围。所有这些都是定义。其中任何一个都将定义您的变量。
答案 1 :(得分:1)
在您的某个文件中定义您的变量一次(以预留空间),
int c = 0;
在其他地方声明你的变量引用 (在所有其他文件中)(以引用所述空间),
extern int c;
但这可能令人困惑,因此将它们命名为“全球”使用,
int glob_a, glob_b;
int glob_c;
float glob_f;
并在其他地方声明你的变量引用,
extern int glob_a, glob_b;
extern int glob_c;
extern float glob_f;
但是你真的想避免乱扔你的命名空间,所以当你有一个全局变量的集合时,声明一个包含它们的结构(在头文件中可能叫做globals.h),
typedef struct globals_struct {
int a, b;
int c;
float f;
} globals_t;
一旦(在你的文件main.c中声明main()),你定义结构
#include globals.h
globals_t globs;
在其他地方,引用空间,
#include globals.h
extern globals_t globs;
通常,您会看到一个诸如此类的节,其中MAIN仅在一个文件中声明,
#ifndef MAIN
extern globals_t globs;
#else
globals_t globs;
#endif
使用你的全局,
int my_a = globs.a;
int my_b = globs.b;
int my_f = globs.f;
注意你是如何避免不必要的命名空间污染的?
因为extern只是告诉编译器(实际上是链接器)一个变量正在别处定义并需要链接。