C 了解extern如何工作
我对extern的理解是,我们可以在程序中的任何地方声明变量并使用它,但我们可以只定义一次。我在下面的程序中遇到一个错误 你好,cC 了解extern如何工作,c,C,我对extern的理解是,我们可以在程序中的任何地方声明变量并使用它,但我们可以只定义一次。我在下面的程序中遇到一个错误 你好,c #include <stdio.h> #include "function.h" extern int c; int main() { int c; c=10; printf("%d\n",c); printExternValue(); return 0; } 功能c #include "funct
#include <stdio.h>
#include "function.h"
extern int c;
int main()
{
int c;
c=10;
printf("%d\n",c);
printExternValue();
return 0;
}
功能c
#include "function.h"
#include "stdio.h"
extern int c;
void printExternValue()
{
printf("%d\n",c);
}
我希望这个程序能打印出来:
10十, 但它没有这样做,因为它给出了一个错误。我在function.c文件中重新声明了变量c,目的是使用存储在所谓外部存储器中的值 错误:函数.c:(.text+0x6):未定义对“c”的引用 我目前正在阅读tutorialspoints中的一个PDF文件,我认为这是非常多余的,因为使用聚合外部变量创建变量的意图是无用的。正确的方法是他们在函数外定义变量,对吗
#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;
}
#包括
//变量声明:
外部内部a、b;
外部内部c;
外部浮动f;
int main()
{
/*变量定义:**/
INTA,b;
INTC;
浮动f;
/*实际初始化*/
a=10;
b=20;
c=a+b;
printf(“c的值:%d\n”,c);
f=70.0/3.0;
printf(“f的值:%f\n”,f);
返回0;
}
变量declread as
extern int c;
是可能需要外部定义的外部声明。在这种情况下,“外部”是指“位于任何功能之外”。您在main()
中本地声明的c
不能满足该角色的要求
由于您在代码中使用的是外部声明的变量c
,因此您必须定义它并只定义一次
你需要
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集合时,请声明一个包含它们的结构(在一个可能称为globals.h的头文件中)
一旦(在声明main()的main.c文件中)定义了结构
#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只是告诉编译器(实际上是链接器)在别处定义了一个变量,需要对其进行链接。您得到了一个关于“未定义符号
c
”的链接时间错误?对于显示的代码,应该准确地引用错误消息。在main()
中定义和引用的c
与extern-int-c无关代码>在main()
之外声明。是的,很抱歉,我更新了线程。由于您的代码从未定义c
,因此找不到它也就不足为奇了。你需要一个intc代码>或int c=314159265代码>或类似的东西在一个函数之外的一个文件中,你链接来创建你的程序。好的,所以我在main中定义了int c,但是它超出了在其他文件中定义的任何函数的范围。正确吗?不,您仍然需要在函数外部定义c
。您好,谢谢您的回答。我在线程中最后更新的声明正确吗?
extern int glob_a, glob_b;
extern int glob_c;
extern float glob_f;
typedef struct globals_struct {
int a, b;
int c;
float f;
} globals_t;
#include globals.h
globals_t globs;
#include globals.h
extern globals_t globs;
#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;