Trong bài học – Biến cục bộ, chúng ta đã nói, “Liên kết của code định danh xác định xem các khai báo khác của tên đó có tham chiếu đến cùng một đối tượng hay không” và chúng ta đã thảo luận về cách các biến cục bộ không có liên kết.

Các định danh biến toàn cục và hàm có thể có liên kết nội bộ hoặc liên kết bên ngoài. Cafedev sẽ đề cập đến trường hợp liên kết bên trong trong bài học này và trường hợp liên kết bên ngoài trong bài học tiếp theo – Liên kết bên ngoài.

Một số nhận dạng có liên kết nội bộ có thể được nhìn thấy và sử dụng trong một file duy nhất, nhưng nó không thể truy cập được từ các file khác (nghĩa là nó không được hiển thị với trình liên kết). Điều này có nghĩa là nếu hai file có ký hiệu nhận dạng được đặt tên giống nhau với liên kết nội bộ, thì các ký hiệu nhận dạng đó sẽ được coi là độc lập.

1. Các biến toàn cục có liên kết nội bộ

Các biến toàn cục có liên kết nội bộ đôi khi được gọi là biến nội bộ.

Để tạo một biến toàn cục không cố định bên trong, chúng tôi sử dụng từ khóa static.

static int g_x; // non-constant globals have external linkage by default, but can be given internal linkage via the static keyword
 
const int g_y { 1 }; // const globals have internal linkage by default
constexpr int g_z { 2 }; // constexpr globals have internal linkage by default
 
int main()
{
    return 0;
}

Các biến toàn cầu Const và constexpr có liên kết nội bộ theo codec định (và do đó không cần từ khóa static – nếu nó được sử dụng, nó sẽ bị bỏ qua).

Dưới đây là ví dụ về nhiều file sử dụng các biến nội bộ:

a.cpp:

constexpr int g_x { 2 }; // this internal g_x is only accessible within a.cpp

codein.cpp

#include <iostream>
 
static int g_x { 3 }; // this separate internal g_x is only accessible within main.cpp
 
int main()
{
    std::cout << g_x << '\n'; // uses main.cpp's g_x, prints 3
 
    return 0;
}

Kết quả:

3

Bởi vì g_x là bên trong mỗi file, codein.cpp không biết rằng a.cpp cũng có một biến có tên là g_x (và ngược lại).

Dành cho người học nâng cao

Việc sử dụng từ khóa static ở trên là một ví dụ về công cụ chỉ định lớp lưu trữ, đặt cả liên kết của tên và thời lượng lưu trữ của nó (nhưng không phải phạm vi của nó). Các chỉ định của lớp lưu trữ được sử dụng phổ biến nhất là static, extern và mutable. Thuật ngữ chỉ định lớp lưu trữ chủ yếu được sử dụng trong các tài liệu kỹ thuật.

2. Quy tắc một định nghĩa và liên kết nội bộ

Trong bài học  – Khai báo và định nghĩa theo thức tự, chúng ta lưu ý rằng quy tắc một định nghĩa nói rằng một đối tượng hoặc hàm không thể có nhiều hơn một định nghĩa, trong một file hoặc một chương trình.

Tuy nhiên, cần lưu ý rằng các đối tượng nội bộ (và chức năng) được xác định trong các file khác nhau được coi là các thực thể độc lập (ngay cả khi tên và loại của chúng giống hệt nhau), do đó không vi phạm quy tắc một định nghĩa. Mỗi đối tượng bên trong chỉ có một định nghĩa.

3. Hàm với liên kết nội bộ

Bởi vì liên kết là một thuộc tính của một định danh (không phải của một biến), các ký hiệu nhận dạng hàm có cùng thuộc tính liên kết code các ký hiệu nhận dạng biến thực hiện. Các hàm mặc định là liên kết bên ngoài (code chúng ta sẽ đề cập trong bài học tiếp theo), nhưng có thể được đặt thành liên kết nội bộ thông qua từ khóa tĩnh:

add.cpp:

// This function is declared as static, and can now be used only within this file
// Attempts to access it from another file via a function forward declaration will fail
static int add(int x, int y)
{
    return x + y;
}

main.cpp:

#include <iostream>
 
int add(int x, int y); // forward declaration for function add
 
int main()
{
    std::cout << add(3, 4) << '\n';
 
    return 0;
}

Chương trình này sẽ không liên kết, vì hàm add không thể truy cập bên ngoài add.cpp.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!