Để trả lời câu hỏi, "tĩnh có nghĩa là chỉ một bản sao của VAL được tạo ra, trong trường hợp tiêu đề được bao gồm bởi nhiều hơn một tệp nguồn?" ...
KHÔNG . VAL sẽ luôn được định nghĩa riêng biệt trong mọi tệp bao gồm tiêu đề.
Các tiêu chuẩn cho C và C ++ thực sự gây ra sự khác biệt trong trường hợp này.
Trong C, các biến có phạm vi tệp là ngoại lệ theo mặc định. Nếu bạn đang sử dụng C, VAL là tĩnh và ANOTHER_VAL là ngoài.
Lưu ý rằng trình liên kết Hiện đại có thể phàn nàn về ANOTHER_VAL nếu tiêu đề được bao gồm trong các tệp khác nhau (cùng một tên chung được xác định hai lần) và chắc chắn sẽ khiếu nại nếu ANOTHER_VAL được khởi tạo thành một giá trị khác trong tệp khác
Trong C ++, các biến phạm vi tệp là tĩnh theo mặc định nếu chúng là const, và extern theo mặc định nếu chúng không phải. Nếu bạn đang sử dụng C ++, cả VAL và ANOTHER_VAL đều tĩnh.
Bạn cũng cần tính đến thực tế là cả hai biến đều được chỉ định là const. Lý tưởng nhất là trình biên dịch sẽ luôn chọn nội tuyến các biến này và không bao gồm bất kỳ bộ nhớ nào cho chúng. Có rất nhiều lý do tại sao có thể phân bổ bộ nhớ. Những người tôi có thể nghĩ đến ...
- tùy chọn gỡ lỗi
- địa chỉ được lấy trong tệp
- trình biên dịch luôn phân bổ lưu trữ (các kiểu const phức tạp không thể dễ dàng được nội dòng, vì vậy sẽ trở thành một trường hợp đặc biệt cho các kiểu cơ bản)