在C语言函数中声明外部变量?

20

在C文件中,我定义了一个变量:int x,如果我想在其他文件中使用它,我知道应该使用extern int x进行声明。

我的问题是:在其他文件中应该在哪里声明它?

  1. 在所有函数之外,

  2. // in file a.c:
    int x;
    
    // in file b.c:
    extern int x;
    void foo() { printf("%d\n", x); }
    
  3. 它将在使用它的函数内部调用吗?

  4. // in file b.c:
    void foo() {
       extern int x;
       printf("%d\n", x);
    }
    

    我有疑问:

    • 哪一个是正确的?,还是
    • 如果两者都正确,哪一个更受欢迎?

4
请参考What are extern variables in C来深入了解这个话题。变量声明应该放在头文件中,这样它只需要被写一次——这意味着你可以比在六个源文件的二十个函数中有二十个副本更容易地进行更改。a.cb.c 都包含了这个头文件——在 a.c 中包含它是为了确保声明与定义匹配。你所展示的两种变量声明方式都是“技术上正确”的;它们按照你的期望工作。但是,也都不是理想的方法。 - Jonathan Leffler
3个回答

20
  1. 两种都是正确的。

  2. 哪一种更好取决于变量使用的范围。

    • 如果你只在一个函数中使用它,那么就在该函数中声明它。

      void foo() 
      {
           extern int x;   <--only used in this function.
           printf("%d",x);   
      }
      
    • 如果在文件中被多个函数使用,请将其声明为全局变量。

    • extern int x;   <-- used in more than one function in this file
      void foo()
      {
          printf("in func1 :%d",x);   
      }    
      void foo1() 
      {
          printf("in func2 :%d",x);   
      }  
      

请解答我的疑惑:对于在函数内声明的外部变量,这与自动存储类有何不同?该extern变量具有静态生命周期范围吗? - Himanshu Mittal

6
假设您在函数中声明了以下内容:

假设您在函数中声明了以下内容:

// in file b.c:
void foo() {
    extern int x;
    printf("%d\n", x);
}
void foo_2() {
    printf("%d\n", x);  <-- "can't use x here"
}

如果在函数foo()内部声明变量x,那么x只能在foo()函数内部使用,在其他函数如foo_2()中无法访问x

然而,如果你在所有函数之前声明x,那么它将在整个文件(所有函数)中可见/可访问。

  // in file b.c:
  extern int x;
  void foo() { printf("%d\n", x); }
  void foo_2() { printf("%d\n", x); }  <--"visible here too"

如果您只需要在单个函数中使用 x,那么您可以在该函数内部声明,但是如果 x 在多个函数中使用,则应在所有函数外部声明 x (也就是第一个建议)。

感谢Yulian、Lidong和Grijesh。我想我已经得到了我想要的所有答案。 :) - Wang Tuma

5

您可以使用另一种技术,即使用extern说明符声明变量。

// in file a.c:
int x;

// in file b.h  //   make a header file and put it in 
                //   the same directory of your project and every
                //   time you want to declare this variable 
                //   you can just INCLUDE this header file as shown in b.c
extern int x;

// in file b.c:
#include "b.h"
void foo() { printf("%d\n", x); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接