外部声明和全球范围

时间:2013-12-04 08:21:15

标签: c variables global-variables extern

我想知道为什么这段代码会编译并运行。我认为如果变量被声明为静态(在全局范围内),它只能在声明它的文件中访问。

functions.h

static int x = 10;

的main.c

#include <stdio.h>
#include "functions.h"

extern int x;

int main()
{
   printf("%d", x);
}

3 个答案:

答案 0 :(得分:1)

从技术上讲,它确实在main.c内声明,因为这包括functions.h。如果它是一个sparate编译模块,那你就是对的。

但是我怀疑在同一个编译单元中externstatic会相互冲突。至少值得警告。

答案 1 :(得分:0)

预处理器获取functions.h中的文本并将其原样复制到main.c中 在预处理之后(以及编译之前),main.c看起来如下:

#include <stdio.h>
static int x = 10;

extern int x;

int main()
{
   printf("%d", x);
}

如果将functions.h包含在第二个源文件中,并且您尝试将两个目标文件链接到一个可执行文件中,则会出现链接器问题。

答案 2 :(得分:-1)

当您在functions.h中加入main.c时,您实际上是function.hmain.c的复制内容,因此您的最终代码将变为:

#include <stdio.h>
static int x = 10;

extern int x;

int main()
{
   printf("%d", x);
}

所以你的外线是多余的。 你可以通过这个实现你想要的 从main.c中删除#include "functions.h"

  1. 使用g++ -c function.h
  2. 编译function.h
  3. 使用g++ -c main.c
  4. 编译main.c
  5. 然后构建g++ function.o main.o -o out 第三行因static int而无法编译。