2010-05-13 40 views
6

Tôi có một chương trình nhỏ mà tôi có thể biên dịch với GCC và ICC mà không gặp bất kỳ khó khăn nào, nhưng tôi cũng muốn mã làm việc với G ++ và ICPC. Tôi cố gắng để thêm video này:Mã C được biên dịch bằng C++: tham chiếu không xác định

#ifdef __cplusplus 
    extern "C" { 
#endif 

ngay từ đầu và điều này:

#ifdef __cplusplus 
    } 
#endif 

ở phần cuối của tất cả các tập tin tiêu đề, nhưng tôi vẫn nhận được nhiều 'tài liệu tham khảo không xác định để "..."' lỗi.

+0

Suy nghĩ đầu tiên: __cplusplus được xác định? – Default

+1

có, nó được định nghĩa bởi trình biên dịch C++ (hoặc ít nhất, những người tôi sử dụng) – Suugaku

+0

có thể trùng lặp của [Câu hỏi mới: Khi nào nên sử dụng extern "C" {// code}?] (Http://stackoverflow.com/questions/ 2796796/newbie-question-when-to-use-extern-c-code) –

Trả lời

7

Tôi nghĩ rằng bạn đang nhận được nó sai ... Các extern C là để vô hiệu hóa mangling chức năng; vì vậy nếu bạn làm điều đó chỉ cho các tập tin tiêu đề, khi bạn cố gắng liên kết mã đối tượng bị xáo trộn của bạn, tên hàm được khai báo sẽ không khớp với tên hàm trong tệp đối tượng.

Dù sao, extern C sẽ không thêm bất kỳ tính di động nào nếu toàn bộ ứng dụng đang được biên dịch và liên kết với cùng trình biên dịch C++, nó dùng để trộn thư viện C với mã C++.

Nếu mã của bạn nằm trong tập hợp con C và C++, bạn có thể biên dịch nó bằng trình biên dịch, nhưng tôi không thể thấy lý do để làm điều đó (bên cạnh làm việc theo nguyên tắc ít ngạc nhiên nhất, như C++ nghiêm ngặt hơn với một số thứ).

2

Bạn nhận được các tham chiếu chưa xác định vì khai báo và định nghĩa không khớp nếu bạn đặt extern "C", ngăn chặn việc mang tên xảy ra: nhưng trong trường hợp này, điều này chỉ xảy ra trong tệp tiêu đề của bạn.

1

Nếu một trong các tham chiếu không xác định là gxx_personality, thì tôi muốn nói bài đăng của "fortran" là chính xác.

+0

Không có gì về gxx_personality, tôi chỉ nhận được các tham chiếu không xác định cho hai hàm khá đơn giản. Một trong những "chức năng không xác định" nằm trong tệp "a.h/a.c" và có thể được sử dụng đúng trong các tệp này, nhưng vì một số lý do không hoạt động trong tệp "b.c". – Suugaku

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