2010-03-04 34 views
12

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?

+2

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. :-) –

+11

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. –

Trả lời

17

Trong ví dụ của bạn, bạn đang tạo một con trỏ tới một hằng số (khối) char thay vì tạo một con trỏ liên tục đến một char. Vì vậy, con trỏ của bạn không phải là hằng số và do đó không hoàn toàn tĩnh.

Bạn cần khai báo xconst char *const A, tạo ra một con trỏ liên tục đến một khối liên tục (khối).

+1

Có. Điều đó sẽ tạo ra một con trỏ liên tục đến một khối các ký tự không đổi, đó là những gì bạn muốn cho một chuỗi chữ. –

Các vấn đề liên quan