Với mô tả của bạn về tình hình, tôi muốn nói sử dụng static const
thành viên là một cách tiếp cận tốt. Trong C++ 11 bạn có thể muốn thay đổi nó thành static constexpr
để nhấn mạnh nó là một hằng số biên dịch-thời gian, mặc dù không có gì có hiệu quả sẽ thay đổi như là kết quả của điều đó.
Nếu bạn tham khảo myclass::kMyClassContant_
ở đâu đó trong mã theo cách có liên quan theo quy tắc một định nghĩa (odr), đặc biệt. trong các ngữ cảnh yêu cầu tham chiếu (bao gồm tham chiếu const), trình biên dịch sẽ phàn nàn rằng không có định nghĩa nào về hằng số. Chỉ khai báo và khởi tạo nó bên trong lớp là không đủ trong trường hợp này. Điều này có thể buộc bạn phải tách khai và định nghĩa:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
Để tránh những rắc rối của việc duy trì khai báo và định nghĩa riêng biệt, một số người thích tuyên bố một chức năng inline constexpr thay vì một biến thực tế:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
này là một công việc chính xác cho nhiều vấn đề liên quan đến odr, và nó không gây ra bất kỳ tổn thất nào về hiệu năng. Cho dù nó thực sự hữu ích phụ thuộc vào bao nhiêu của một gánh nặng nó là để duy trì khai báo riêng biệt và định nghĩa của một hằng số tĩnh bình thường. Nếu bạn mong đợi các hằng số của bạn không bao giờ thay đổi khi mã của bạn phát triển, sử dụng hằng số tĩnh bình thường với các định nghĩa riêng biệt là thích hợp hơn. Nhưng nếu bạn thay đổi định nghĩa hằng số, phải biên dịch lại tệp định nghĩa và liên kết lại nó với tất cả các phần có liên quan của dự án, bạn có thể xem xét giải pháp dựa trên chức năng ở trên như một giải pháp thay thế tốt hơn.
Nhận xét cuối cùng về kiểu dữ liệu: Buộc nó vào 16 bit sử dụng std::uint16_t
có thể hữu ích nếu bạn cần lưu trữ nhiều giá trị này dưới dạng nén. Nếu không, kích thước thực tế có thể không thực sự quan trọng, trong trường hợp này, std::uint_fast16_t
(có thể lớn hơn 16 bit) có thể tốt hơn.
Không, không có gì sai với điều đó. (Hy vọng rằng một số chuyên gia C++ sẽ không phải sửa tôi. :)) – xxbbcc
Bạn có thể nhận được câu trả lời tốt hơn tại http://codereview.stackexchange.com. –
Có, đó là cách thông thường để khai báo một hằng số toàn cầu. –