C 语言 - 链接属性
发布人:shili8
发布时间:2025-01-18 06:08
阅读次数:0
**C语言 - 链接属性**
在 C语言中,链接属性是指编译器如何处理程序的符号(函数、变量等)的定义和引用。链接属性决定了程序的符号是否可以被其他程序使用。
**1. 内联连接**
内联连接是最常见的链接方式。在这种方式下,编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**2. 内联连接(静态)**
内联连接(静态)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器不会生成任何的共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**3. 内联连接(动态)**
内联连接(动态)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**4. 内联连接(弱)**
内联连接(弱)是指编译器不会将一个模块中的所有符号都导出到外部,使得其他模块不能访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**5. 内联连接(强)**
内联连接(强)是指编译器不会将一个模块中的所有符号都导出到外部,使得其他模块不能访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**6. 内联连接(混合)**
内联连接(混合)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**7. 内联连接(自定义)**
内联连接(自定义)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**8. 内联连接(模块化)**
内联连接(模块化)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**9. 内联连接(接口化)**
内联连接(接口化)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**10. 内联连接(抽象化)**
内联连接(抽象化)是指编译器会将一个模块中的所有符号都导出到外部,使得其他模块可以访问这些符号。但是,这种方式下,编译器会生成一个共享库文件。例如:
c// a.cint add(int a, int b) { return a + b; } // main.c#include "a.h" int main() { int result = add(1,2); printf("%d ", result); // 输出:3 return0; }
在上面的例子中,`add()`函数被定义在 `a.c` 中,并且导出到外部。因此,在 `main.c` 中,可以直接使用 `add()` 函数。
**总结**
本文介绍了 C语言中的链接属性,包括内联连接、静态连接、动态连接、弱连接、强连接、混合连接、自定义连接、模块化连接、接口化连接和抽象化连接。这些链接属性决定了程序的符号是否可以被其他程序使用,并且影响到程序的性能和可维护性。
**参考**
* 《C语言程序设计》第5 章* 《C++ Primer》第10 章* 《编程之道》第3 章