【问题标题】:Understanding how extern works了解 extern 的工作原理
【发布时间】:2017-04-04 00:11:02
【问题描述】:

我理解 extern 的方式是我们可以在程序的任何地方声明一个变量并使用它,但我们可以只定义一次。我在以下程序中遇到错误。

你好.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): undefined reference to `c'

我目前正在从 tutorialspoints 中读取 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; 
} 

【问题讨论】:

  • 您收到有关“未定义符号c”的链接时错误?对于您显示的代码,您应该准确引用错误消息。在main() 内部定义和引用的c 与在main() 外部声明的extern int c; 无关。
  • 是的,抱歉,我更新了帖子。
  • 由于您的代码从未定义c,因此找不到它也就不足为奇了。您需要一个 int c;int c = 314159265; 或在您链接的文件之一中的函数之外的类似内容来创建程序。
  • 好的,所以我在 main 中定义了 int c,但它超出了其他文件中定义的任何函数的范围。对吗?
  • 不,你仍然需要在函数之外定义c

标签: c


【解决方案1】:

变量声明为

extern int c;

是一个 external 声明,可能需要 external 定义。在这种情况下,“外部”是指“位于任何功能之外”。您在 main() 本地声明的 c 并不能满足该角色。

由于您在代码中使用外部声明变量c,因此您必须定义它并且只定义它一次

你需要

int c;

int c = 0;

extern int c = 0;

它是您的实现文件之一,在文件范围内。所有这些都是定义。它们中的任何一个都会定义你的变量。

【讨论】:

  • 您好,感谢您的回答。我在线程中最近更新的声明正确吗?
【解决方案2】:

在您的一个文件中定义您的变量一次(以保留空间),

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() 的文件 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 只是告诉编译器(实际上是链接器)一个变量正在其他地方定义并且需要链接。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2012-12-11
    • 2011-02-18
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多