C 了解extern如何工作

C 了解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

我对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 "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;