【问题标题】:Declaring global variables in C using extern使用 extern 在 C 中声明全局变量
【发布时间】:2020-04-01 07:52:56
【问题描述】:

good answer 开始,在 C 中声明全局变量的最佳方法是使用 extern 在 1 个标头中声明变量,并仅在 1 个源中定义它。然后在想要使用全局变量的其他源文件中引用头文件。

所以我这样做了,在我的标题global.h

extern Boolean transmitting;

在我的 main.c 中,我在 main 函数中定义了它:

int main() {
    Boolean transmitting = FALSE;
...
}

但是,我在主 "unused variable 'transmitting' [-Wunused-variable]" 中的变量上收到警告,告诉我这仅在主范围内定义,所以其他源文件不能使用它?这是否意味着我需要在main() 之外定义它们?

以前,我没有使用 extern 关键字在我的 header 中声明,而是在我的 main 中使用了这样的变量:

int main() {
    transmitting = FALSE;
...
}

一切正常,其他源文件可以通过包含此标头访问该变量。但是我想使用正确的方法来声明全局变量。我哪里做错了?

【问题讨论】:

  • 全局变量需要在任何函数之外定义。您在函数中定义的任何东西(甚至是主函数)都是局部变量,并且永远无法从该函数外部看到

标签: c


【解决方案1】:

您必须在全局范围内声明变量,即在 main() 函数之外。

【讨论】:

  • 我以前的方法呢?这真的是不好的做法吗?
  • 好吧,它根本不是那样工作的。全局变量必须在全局范围内声明。
  • 我仍然不清楚,因为当我在头文件中定义没有 extern 的全局变量时,在主文件中给了它们一个值,因此包含这个 1 头文件的所有其他来源实际上打印了正确的每当源更改它时变量的值。有了这种行为,我似乎不是在“在多个文件中定义相同的变量”。看起来这些 vars 真的是全局的,没有使用 extern。
  • @Sarahcartenz 我认为您在这里描述的是变量的“暂定定义”,请参阅stackoverflow.com/questions/3095861/about-tentative-definition
【解决方案2】:

在您的情况下,您声明了两个不同的变量。在 main 函数中,它是局部变量,被限制在 main 的范围内。

看下面程序的结果,两个变量的地址不同:

#include <stdio.h>
#include <stdbool.h>
extern bool transmitting;

void print_transmitting() {
  printf("extern transmitting addr= %p\n", &transmitting);
}
int main(void) {
    bool transmitting = false;
    print_transmitting();
    printf("in main function, transmitting addr = %p\n", &transmitting);
    return 0;
}

结果:

extern transmitting addr= 0x563bc90ce011
in main function, transmitting addr = 0x7ffd251fb367

作为@Marc Balmer 的回答,您必须在全局范围内声明变量,即在 main() 函数之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多