我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?
这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern?
我一直在测试全局变量,定义和声明,我在这种情况下停了下来:
主文件:
#include "stdio.h"
void func(void);
int a;
int main(void) {
a = 20;
printf("in main: %d\n", a);
func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
添加.c:
#include <stdio.h>
void func(void);
int a;
void func() {
printf("in add: %d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
所以在 C 中
int a;
Run Code Online (Sandbox Code Playgroud)
既表示声明又表示定义,但我们知道不允许多次定义变量。那么,如果我们有两个定义和两个声明,为什么这段代码会编译a呢?我在 CLion 中工作,当我在 main 中按“转到定义/声明”时a,它会将指针移至aadd.c,当我在 add.c 中执行相同操作时,它会移回 main.c,因此我无法理解这里发生了什么。
git 的第一个版本出现于 2005 年。出于好奇和学习的目的,我试图让它运行。源代码在这里。文件很少,所以看起来很合理,但是由于缺乏 C 细节知识,我陷入了困境。
哪些分步说明可以让它在macOS(最好)或 FreeBSD 上运行,并根据需要修改文件?
使用macOS Big Sur:
Makefile,更改install $(PROG) $(HOME)/bin/为install $(PROG) ./bin/cache.h,添加行#include <string.h>和#include <unistd.h>。brew install opensslln -s ../opt/openssl/include/openssl .make install结果:错误和警告墙,包括"no member named 'st_ctim' in 'struct stat'","no member named 'st_mtim' in 'struct stat'"等等。
使用FreeBSD 12:
Makefile,更改install $(PROG) …