Sau khi đọc rất nhiều câu hỏi liên quan đến khởi tạo các biến tĩnh Tôi vẫn không chắc chắn làm thế nào điều này áp dụng cho const
biến ở mức không gian tên.const biến trong tập tin tiêu đề và tĩnh khởi tạo fiasco
Tôi có loại đoạn mã sau vào một tiêu đề tập tin config.h
được tạo ra bởi việc xây dựng kịch bản:
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
Theo những gì tôi đã đọc các từ khóa static
là không cần thiết, thậm chí bị phản đối ở đây.
Câu hỏi của tôi: Mã trên có dễ bị thất bại khởi tạo tĩnh không?
Nếu tôi có sau đây trong một tiêu đề tập tin myclass.h
:
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
này sẽ gây ra bất kỳ vấn đề với khởi tạo tĩnh?
Nếu tôi hiểu đúng, do const
biến có liên kết nội bộ nên không có vấn đề gì trong cả hai trường hợp?
Edit: (do dribeas câu trả lời)
Có lẽ tôi nên đề cập đến mà tôi đang quan tâm trong trường hợp sử dụng như:
Trong main.cpp
:
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
Câu hỏi khác về việc sử dụng này case: Trình biên dịch có tối ưu hóa path2
trong trường hợp này không?
đó là không đúng sự thật rằng 'static' chỉ có thể được sử dụng trong các tập tin thực hiện. –
tất nhiên, không có khái niệm về tệp thực hiện trong C++, tôi sẽ cố gắng thay đổi từ ngữ – Philipp
Tôi nghĩ cụm từ bạn đang tìm kiếm là "đơn vị dịch" thay vì tệp triển khai. Giá trị phải được khai báo trong tiêu đề và được xác định trong nhiều nhất một đơn vị dịch. Trong trường hợp này, vì chúng là const và ngụ ý liên kết nội bộ, bạn không nhận được lỗi biểu tượng được định nghĩa nhân tại thời gian liên kết, nhưng bạn có cùng biểu tượng được định nghĩa trong mọi đơn vị dịch bao gồm tiêu đề này. Vì chúng có liên kết nội bộ, chúng không phá vỡ liên kết, nhưng trình biên dịch có thể không loại bỏ các bản sao. Tôi một lần cạo 8 MB ra một thực thi bằng cách loại bỏ các định nghĩa của chuỗi từ tiêu đề. – legalize