2012-03-13 29 views
16

Tôi phải liên kết hai thư viện, nói A và B. Một số tệp phổ biến trong cả hai thư viện. Vì vậy, tôi khai báo các hàm trong thư viện A bên trong một không gian tên, nói abc. Vì vậy, trong A và B, một hàm func trông giống như dưới đây:C++: Các hàm bên ngoài C bên trong một không gian tên

[ in A] 

    namespace abc { 
    extern "C" void func(); 
    } 


[in B] 

    extern "C" void func(); 

Trong khi xây dựng dự án, trình biên dịch ném lỗi liên kết nói nhiều định nghĩa về chức năng Func. Không phải là hàm func trong A bên trong không gian tên hoặc có một số vấn đề với các hàm "C" bên ngoài. Nếu có, thì làm thế nào tôi có thể phân biệt cả hai?

Trả lời

23

Khi bạn sử dụng Extern "C", bạn đang tắt cắt xén tên để bạn mất thông tin không gian tên vì C không có khái niệm như vậy. Điều này gây ra một định nghĩa trùng lặp.

+1

Lưu ý, tuy nhiên, việc mang tên có thể không được tắt cho bộ tiền xử lý C. Trong Visual C++ 2010, giá trị của macro '__FUNCTION__' vẫn là số nhận dạng đủ điều kiện ngay cả trong' extern "C" ', ví dụ: "tên của bạn". Điều này sẽ rơi trên đôi chân của bạn khi gọi macro trong không gian tên sử dụng các macro được xác định trước như '__FUNCTION__',' __PRETTY_FUNCTION__' hoặc '__func__'. Trong trường hợp của tôi (xuất C stubs từ một DLL) nó đã làm ;-) –

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