Sự khác biệt giữa hai khai báo sau đây là gì? Tôi nghĩ chúng tương đương nhau, nhưng mẫu đầu tiên hoạt động, và mẫu thứ hai thì không. Tôi có nghĩa là nó biên dịch và chạy, nhưng mã hiển thị bitmap hiển thị trống. Tôi chưa bước qua nó, nhưng tôi có thiếu cái gì đó hiển nhiên không? GUI_BITMAP là một cấu trúc đơn giản mô tả một bitmap. Điều này là dành cho VC + + 2005, nhưng tôi nghĩ rằng nó không thành công trong VC++ 2008. Gãi đầu của tôi trên một này ...Vấn đề với từ khóa bên ngoài trong C++
Mẫu 1:
extern "C" const GUI_BITMAP bmkeyA_cap_active;
extern "C" const GUI_BITMAP bmkeyA_cap_inactive;
Mẫu 2:
extern "C"
{
const GUI_BITMAP bmkeyA_cap_active;
const GUI_BITMAP bmkeyA_cap_inactive;
};
Edit: More thăm dò đã cho thấy rằng ví dụ thứ hai là tạo ra các cấu trúc, trong khi đầu tiên là đề cập đến các cấu trúc bên ngoài. Ví dụ thứ hai sẽ không liên kết, vì có hai biến ở phạm vi toàn cục có cùng tên. Nhưng nó không, nó sẽ gửi một cấu trúc không đầy đến mã hiển thị mà từ bỏ. Hmmm .....
Chỉnh sửa 2: Chạy cùng một mã thông qua trình biên dịch khác (IAR) thực sự không biên dịch được trên Mẫu 2, với lỗi về thiếu hàm tạo mặc định. Vì vậy, tôi đoán có cái gì đó tinh tế về từ khóa "extern", cấu trúc, và C + + mà tôi không nhận được. Nếu những thứ trong khu vực bên ngoài có chức năng thì hai mẫu sẽ giống hệt nhau không?
Cảm ơn bạn đã trả lời, nhưng không có đối tượng thư viện nào được sử dụng ở đây, đây chỉ là mã của tôi, một hỗn hợp của C và C++. Câu hỏi ban đầu của tôi vẫn còn - sự khác biệt giữa Mẫu 1 và Mẫu 2 - Tôi nghĩ rằng họ nên tạo chính xác cùng một mã? Nếu mọi thứ là các hàm thay vì cấu trúc - chúng giống nhau, đúng không? – Jeff
@ Jeff, câu trả lời nhanh cho câu hỏi của bạn là không, hai cái đó không giống nhau, đó là lý do tại sao bạn thấy vấn đề.Trong trường hợp thứ hai, bạn chỉ sửa đổi các câu lệnh bên trong '{}' để sử dụng các quy ước liên kết của C. Trong ví dụ đầu tiên, bạn đang làm điều đó * plus * chỉ ra rằng các biến được khai báo ở nơi khác. http://msdn.microsoft.com/en-us/library/0603949d(VS.80).aspx –