我想知道为什么这段代码会编译并运行。我认为如果变量被声明为静态(在全局范围内),它只能在声明它的文件中访问。
functions.h
static int x = 10;
的main.c
#include <stdio.h>
#include "functions.h"
extern int x;
int main()
{
printf("%d", x);
}
答案 0 :(得分:1)
从技术上讲,它确实在main.c
内声明,因为这包括functions.h
。如果它是一个sparate编译模块,那你就是对的。
但是我怀疑在同一个编译单元中extern
和static
会相互冲突。至少值得警告。
答案 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.h
中main.c
的复制内容,因此您的最终代码将变为:
#include <stdio.h>
static int x = 10;
extern int x;
int main()
{
printf("%d", x);
}
所以你的外线是多余的。
你可以通过这个实现你想要的
从main.c中删除#include "functions.h"
g++ -c function.h
g++ -c main.c
g++ function.o main.o -o out
第三行因static int
而无法编译。