2016-06-02 18 views
5

Sự cố này được sao chép trong g ++ trước -std=c++14. Lỗi liên kết được tạo do được đánh dấu là const được hiển thị trong các mã bên dưới. Nó biến mất, nếu RHS const bị xóa.Lỗi liên kết do độ chụm của mảng con trỏ trong C++ 03/C++ 11

/* main.cpp */ 
const char* const arr[2] = {"Hello", "World"}; 
//   ^^^^^ 
int main() {} 

/* foo.cpp */ 
extern const char* const arr[2]; 
//     ^^^^^ 
const char* foo() { return arr[0]; } 

Trong khi biên soạn: g++ [-std=c++11] main.cpp foo.cpp, nó mang lại sau lỗi khi liên kết:

In function `foo()': undefined reference to `arr' 

Có một lỗi biên dịch hoặc một giới hạn ngôn ngữ/Tính năng?

+3

'biến' const ở phạm vi không gian tên [là hoàn toàn 'tĩnh'] (http://stackoverflow.com/questions/33402177/const-global-variable-in-namespace), trừ khi bạn thêm' extern'. Tôi không chắc chắn lý do tại sao hành vi thay đổi với '-std = C++ 14'. – Quentin

+0

Không nên 'extern const char * const arr [2];' nằm trong một tệp tiêu đề mà cả 'main.cpp' và' foo.cpp' đều bao gồm? – NathanOliver

+0

@Quentin Tôi không chắc tại sao OP lại nói trước C++ 14, g ++ 5.1.0 tạo lỗi ở bất kỳ chế độ nào (C++ 14 C++ 17), nhận xét của bạn phải là câu trả lời – Slava

Trả lời

3

Như chú ý của Quentin, dự thảo n4296 là rõ ràng về điều đó trong chương trình chương 3.5 và liên kết [basic.link] §3 (nhấn mạnh của tôi)

A name having namespace scope (3.3.6) has internal linkage if it is the name of
(3.1) — a variable, function or function template that is explicitly declared static; or,
(3.2) — a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage;

Khi bạn khai báo arr là const, nó là ngầm được cho liên kết nội bộ. Việc sửa chữa là tầm thường:

/* main.cpp */ 
extern const char* const arr[2] = {"Hello", "World"}; 

Nhưng thực hành tốt nhất sẽ khuyên bạn nên có extern const char* const arr[2]; trong một tiêu đề bao gồm trong tất cả các file sử dụng arr nhằm chia sẻ một cách chính xác việc kê khai và sau đó thêm vào một trong các tập tin const char* const arr[2] = {"Hello", "World"};, năng suất hiệu quả:

/* main.cpp */ 
extern const char* const arr[2]; // directly or more likely through an include... 
... 
const char* const arr[2] = {"Hello", "World"};