📜  C语言中的内部链接和外部链接(1)

📅  最后修改于: 2023-12-03 14:40:27.777000             🧑  作者: Mango

C语言中的内部链接和外部链接

在C语言中,链接(Linking)是指将多个源文件编译后链接成一个可执行文件或库文件的过程。链接分为内部链接(Internal Linkage)和外部链接(External Linkage)两种,下面我们一一介绍。

内部链接

定义在一个函数或文件内部的变量或函数具有内部链接。内部链接的变量或函数只能在定义它们的函数或文件中使用,其他的函数或文件无法访问到。

例如,下面的代码定义了一个具有内部链接的静态变量:

//file1.c
#include <stdio.h>

void func1();

int main() {
    func1();
    return 0;
}

void func1() {
    static int num = 0; //具有内部链接的静态变量
    num++;
    printf("num = %d\n", num);
}

运行程序后输出:

num = 1

这是因为在func1函数内部定义了一个具有内部链接的静态变量num,每次调用func1函数时,num变量的值都会+1。

外部链接

定义在一个文件中,但是可以被其他文件调用的变量或函数具有外部链接。外部链接的变量或函数可以被其他文件使用。

例如,下面的代码定义了一个具有外部链接的全局变量:

//file1.c
#include <stdio.h>

void func1();

int num = 0; //具有外部链接的全局变量

int main() {
    func1();
    return 0;
}

void func1() {
    num++;
    printf("num = %d\n", num);
}

此时如果我们想在另一个文件中使用num变量,需要使用extern关键字进行声明:

//file2.c
#include <stdio.h>

extern int num; //声明外部链接的全局变量

void func2() {
    printf("num = %d\n", num);
}

注意,在进行链接时,需要将file1.cfile2.c编译后再进行链接:

$ gcc file1.c -c
$ gcc file2.c -c
$ gcc file1.o file2.o -o main
$ ./main
num = 1
num = 1

这是因为我们在file1.c中定义了num变量,并在file2.c中声明了num变量,链接时会将这两个变量链接起来。

总结

内部链接的变量或函数只能在定义它们的函数或文件中使用,而外部链接的变量或函数则可以被其他文件调用。在进行链接时,需要将所有需要链接的源文件编译后再进行链接,否则会出现undefined reference错误。