Tôi biết rằng static const int x = 42;
ở phạm vi không gian tên tương đương với const int x = 42;
vì các biến số const
hoàn toàn là static
(chúng phải được khai báo extern
để được cung cấp liên kết bên ngoài). Mỗi đơn vị dịch bao gồm tuyên bố này sẽ nhận được một bản sao địa phương là x
.Không phải là biến const ở phạm vi không gian tên ngầm là tĩnh?
Điều này chỉ áp dụng cho một số loại (có thể là số nguyên?) Nhất định không? Tôi có đoạn code sau đây trong một tập tin tiêu đề:
namespace XXX {
static const char* A = "A";
static const char* B = "B";
static const char* C = "C"; // and so on
}
(XIN tha cho tôi những ý kiến trên tại sao tôi không nên sử dụng chuỗi C-phong cách - đây là mã di sản)
Tiêu đề này là bao gồm từ một số tập tin nguồn, và tất cả đều tốt (mỗi đơn vị biên dịch sẽ có bản sao riêng của chúng trong số này của char*
). Tôi đã có thể nghĩ rằng tôi có thể loại bỏ các static
từ này, vì nó là dự phòng, nhưng khi tôi làm, tôi nhận được lỗi liên kết về các biểu tượng đã được xác định trong đối tượng khác. Tôi đang thiếu gì ở đây? Có phải của const char*
không phải là hoàn toàn tĩnh?
Chuỗi C là điều xấu. Họ sẽ làm cho răng của bạn bị thối, nếp nhăn da của bạn, và ăn cắp kẹo từ trẻ sơ sinh. Xấu hổ với bạn vì đã từng nghĩ rằng bạn có thể sử dụng chúng trong mã cũ. Bạn phải dành vài năm để viết lại dự án của mình với các chuỗi C++ thuần túy. :-) –
Thực ra, việc tạo các hằng số có tên cho các giá trị chuỗi là một cách sử dụng tốt các chuỗi char *. Nếu bạn sử dụng std :: string, thì một cá thể chuỗi sẽ được tạo ra, sử dụng phân bổ bộ nhớ động, trong mỗi đơn vị dịch mà #includes các định nghĩa chuỗi. Điều này là lãng phí, và trong trường hợp của một vấn đề phân bổ bộ nhớ, khó chẩn đoán. –