Linkage trong C
🔹 Linkage trong C là gì?
Trong C, Linkage (sự liên kết) xác định xem các định danh như biến hoặc hàm, trong các tệp mã nguồn khác nhau, có chỉ đến cùng một đối tượng trong bộ nhớ hay không.
Nói cách khác, linkage cho biết liệu hai tên giống nhau ở các file khác nhau có “nói về cùng một thứ” hay không.
Để hiểu hơn về Linkage thì cần phải hiểu một khái niệm: Translation Unit là gì?
Translation Unit
Một translation unit (đơn vị dịch) là toàn bộ nội dung mà compiler nhìn thấy khi biên dịch một file .c
Bao gồm:
- Mã nguồn trong
file .c. - Tất cả các file header
(.h)được#include - Và các macro, khai báo, định nghĩa liên quan.
Sau khi biên dịch xong, mỗi translation unit sẽ tạo ra một file đối tượng (.o). Các file .o này sau đó được liên kết (link) lại với nhau để tạo thành chương trình thực thi.
Tại sao cần Linkage?
Khi chương trình có nhiều file .c, nếu bạn muốn:
- Một biến hoặc hàm được dùng chung giữa nhiều file → cần external linkage.
- Hoặc chỉ muốn sử dụng trong nội bộ file → cần internal linkage.
Linkage chính là cơ chế giúp trình liên kết (linker) biết nên xử lý theo cách nào. Nó trả lời cho hai câu hỏi:
- “Biến này có thể được truy cập từ file khác không?”
- “Tên này có đại diện cho cùng một đối tượng ở file khác không?”
Các loại linkage
Internal linkage
Các định danh có internal linkage (hay còn gọi là liên kết nội bộ) chỉ có thể truy cập trong cùng translation unit (source code). Điều này thường được thực hiện bằng từ khóa static.
Ví dụ
static int count = 10; // Accessible only within this file
External Linkage
Các định danh có external linkage (hay còn gọi là liên kết ngoài) có thể truy cập trong nhiều translation unit (source code). Theo mặc định, global varables và function có liên kết ngoài trừ khi được khai báo một cách rõ ràng.
Ví dụ
int count = 10; // Accessible across translation units
extern int count; // Declaration in another file
Default Linkage Rules
- Global variables: Theo mặc định, biến toàn cục sẽ có liên kết ngoài nếu không khai báo với từ khóa
static. Điều này có nghĩa là nó có thể được truy cập từ những file khác sử dụng từ khóaextern. - Functions: Theo mặc định, hàm có liên kết ngoài có thể dùng bởi những translation unit khác (file khác) nếu không khai báo với từ khóa
static. constvariables: global const variables theo mặc định thì có liên kết nội bộ. Để có liên kết ngoài, cần sử dụng từ khóaextern.
const int value = 42; // Internal linkage
extern const int value; // External linkage
- Local variables: biến không có liên kết, chỉ có thể sử dụng bên trong hàm mà nó được khai báo.
- Tham số của một hàm cũng là một loại không có liên kết, vì nó cũng chỉ có thể sử dụng trong phạm vi hàm đó.
Ví dụ
Internal Linkage
// file1.c
static int count = 5; // Internal linkage
void increment() {
count++;
}
count chỉ có thể sử dụng được trong file1.c
External Linkage
// file1.c
int count = 5; // External linkage
void increment() {
count++;
}
// file2.c
extern int count; // Declaration of the same variable
void decrement() {
count--;
}
Trong ví dụ này, count được chia sẽ bởi file1.c và file2.c. Tuy nhiên bạn cần lưu ý, race condition.
const Variables
// file1.c
const int max_value = 100; // Internal linkage
extern const int min_value = 0; // External linkage
// file2.c
extern const int min_value; // Accessing the external variable
Các điểm cần nhớ
- Từ khóa
staticcho liên kết nội bộ để giới hạn phạm vi của biến và hàm trong chỉ duy nhất 1 file. - Từ khóa
exxterncho liên kết ngoài để có thể chia sẽ các biến và hàm với file khác. - Cẩn thận khi sử dụng biến global, vì có thể dẫn đến các xung đột về tên.
- Và cuối cùng, với
constcần lưu ý là theo mặc định liên kết nội bộ nếu không khai báoextern.
Tham khảo
All rights reserved