2013-02-20 35 views
10

Tôi muốn cung cấp một chuỗi liên tục trong một API như vậy:extern const char * const SOME_CONSTANT đem lại cho tôi lỗi mối liên kết

extern const char* const SOME_CONSTANT; 

Nhưng nếu tôi định nghĩa nó trong tập tin nguồn thư viện tĩnh của tôi như

const char* const SOME_CONSTANT = "test"; 

tôi nhận được mối liên kết lỗi khi liên kết chống lại thư viện đó và sử dụng SOME_CONSTANT:

lỗi 1 lỗi LNK2001: biểu tượng bên ngoài chưa được giải quyết " const char * const SOME_CONSTANT"(? SOME_CONSTANT @@ 3QBDB)

Loại bỏ các con trỏ const-Ness (từ khóa const thứ hai) từ cả extern const char* const khai và định nghĩa làm cho nó hoạt động. Làm thế nào tôi có thể xuất nó với con trỏ const-ness?

+0

, có vẻ như không sao http://stackoverflow.com/questions/2190919/mixing-extern-and-const –

+0

Xem như bạn đã gắn thẻ nó C++, không phải là một "chuỗi liên tục" thực sự là 'const std :: string' ở nơi đầu tiên? – Angew

+0

Ngoài ra, khai báo 'extern' có thể nhìn thấy trong tệp nguồn xác định hằng số không? – Angew

Trả lời

11

Sự cố có thể là tuyên bố extern không hiển thị trong tệp nguồn xác định hằng số. Cố gắng lặp lại những tuyên bố trên các định nghĩa, như thế này:

extern const char* const SOME_CONSTANT; //make sure name has external linkage 
const char* const SOME_CONSTANT = "test"; //define the constant 
+0

Điều đó có hiệu quả. Tôi đã chỉ tự hỏi làm thế nào các mối liên kết biết nó không nên dải biểu tượng của tôi ... và sau đó tôi thấy câu trả lời của bạn và facepalmed: D Tất nhiên tôi phải thực thi liên kết extern. – AndiDog

+3

@AndiDog Lưu ý rằng điều này cũng giống như chỉ thêm 'extern' vào định nghĩa. Như câu trả lời khác gợi ý, 'const' trong C++ ngụ ý' tĩnh'. Vì vậy, bạn cần phải chống lại điều đó và rõ ràng nói 'extern' trong định nghĩa của bạn quá. –

+1

"' const' trong C++ ngụ ý 'tĩnh' ... Điều này có vẻ như một hack tùy ý trong đặc tả C++. Tối ưu hóa vi cho người lười! – FooF

9

có lẽ hầu hết bạn quên bao gồm tiêu đề của bạn trong tập tin thực thi của bạn

dù sao, thêm từ khóa extern định nghĩa

mà không có một extern tuyên bố nó có liên kết nội bộ và do đó không hiển thị cho trình liên kết

+0

Điều này có vẻ đúng (được thử nghiệm với 'gcc' gần đây trong Linux), +1 cho bạn. Tại sao lại như vậy? Điều gì là hợp lý ở đây? Để đảm bảo rằng khai báo và định nghĩa tệp tiêu đề Bất kỳ liên kết nào để giải thích cho hành vi khó hiểu này? – FooF

+0

lý do hợp lý, tại sao hằng số không 'bên ngoài có liên kết nội bộ trong C++, tôi nghĩ rằng nó phải làm với việc tránh va chạm tên không cần thiết và một sự cố Quy tắc Định nghĩa để liên kết. C99 có một tính năng * giống như * nhưng không chính xác các quy tắc tương tự (tôi không chắc chắn về chi tiết). về cơ bản nó có nghĩa là bạn có thể tự do khai báo * và xác định * hằng số trong các tệp tiêu đề. Bạn có thể xem xét di chuyển định nghĩa không đổi của bạn vào tệp tiêu đề, và sau đó chỉ đơn giản là bỏ qua 'extern'. Sau đó, bạn có thể thêm một 'static' để đo lường tốt, nhưng nó không bắt buộc: đó là tất cả những gì về nó. –

+0

Như bạn đã đề cập, luôn có khả năng xác định 'static const char * const SOME_CONSTANT =" test ";' trong tập tin header. Hoặc chúng ta có thể đặt định nghĩa trong không gian tên vô danh trong tiêu đề ... Điều này dường như với tôi giống như một hack ngu ngốc mà chỉ cần thêm sự phức tạp không cần thiết cho định nghĩa ngôn ngữ !!! Có thể nó được coi là dễ đọc hơn đối với các tệp tiêu đề không bị lộn xộn với 'không gian tên' tĩnh hoặc ẩn danh. – FooF

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