了解外部如何运作

时间:2017-04-04 00:11:02

标签: c

我理解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; 
} 

2 个答案:

答案 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只是告诉编译器(实际上是链接器)一个变量正在别处定义并需要链接。