2010-08-26 35 views
10

Khá một câu hỏi mới.Có đúng là tất cả các thư viện c có thể được sử dụng trong C++?

+0

Bạn có nghĩa là tiêu đề thư viện C chuẩn hoặc bất kỳ thư viện tùy chỉnh nào được viết bằng C không? Và chúng ta đang nói về phiên bản C nào? Ngoài ra, bạn có một nền tảng trong tâm trí? – Allbite

+2

@Allbite: Tất cả đều không liên quan đến câu hỏi. –

+0

Việc triển khai đó thay đổi theo sự hỗ trợ chính xác của họ đối với tiêu chuẩn C++ và có các phiên bản khác nhau của C và C++ (như trong C99, ANSI, C++ 0x, v.v.), một số làm rõ theo thứ tự. Cụ thể là, bạn có hỏi về các hàm thư viện chuẩn của C hay không, ví dụ: "strcpy", hoặc là bạn có nghĩa là hoàn toàn bất kỳ tùy chỉnh C lib được viết bởi bất cứ ai? – Allbite

Trả lời

6

Có. Không có lý do gì bạn không thể sử dụng các thư viện C trong C++. Mọi thứ thay đổi nếu bạn muốn biên dịch C trong trình biên dịch C++. C ABI được hỗ trợ đầy đủ từ C++, tuy nhiên mọi thứ không nhất thiết phải rất gọn gàng từ quan điểm API. Một số bổ sung C như restrict không có trong tiêu chuẩn C++ và phải được xử lý cẩn thận.

+0

Đánh bại tôi bằng 30 giây với cùng câu trả lời :) –

+0

@ Morgan McK-Graham: Cầu thang dài trong tháp của bạn :) –

+2

Trường hợp cực đoan hơn có thể là một hàm lấy đối số kiểu vla, ví dụ 'int foo (int n, char x [] [n]); '- hy vọng tôi đã đúng. –

2

Nếu tiêu đề được bảo vệ đúng cách với extern "C" { ... }, thì có.

+0

Nếu không, bạn có thể tạo tiêu đề của riêng mình hoặc bạn có thể bọc các tiêu đề hiện có. –

+0

Tôi sẽ không gọi đặt 'extern" C "{...}' vào tiêu đề cho mã ngôn ngữ C "đúng", nhưng câu trả lời của Stephen có thể được hiểu là đặt 'extern" C "{...}' xung quanh dòng '# include'. –

+2

@R ..: Tất nhiên, một trong hai bảo vệ 'extern" C "' với '#if được xác định __cplusplus', hoặc kết thúc tốt đẹp bao gồm thay vì tiêu đề chính nó. Nghĩ rằng đó là một cái đã cho. –

0

Có và không.

Các questionables là ...

  • Compund literals

  • số phức Native kiểu dữ liệu

  • "hạn chế" từ khóa

  • macro variadic

  • "long long int" datatype

Một số tính năng từ C được bao gồm trong C++ 0x và một số có sẵn dưới dạng phần mở rộng thư viện trong nhiều trình biên dịch mới hơn cho "bình thường" C++.

Vì vậy, nó phụ thuộc vào mức độ C bạn đang nói, mức tiêu chuẩn C++ và nền tảng nào của trình biên dịch nào khi triển khai trình biên dịch luôn có sự hỗ trợ đa dạng cho các tiêu chuẩn và lỗi.

Và sau đó có các từ khóa được sử dụng trong C++ không được xác định trong C, và do đó có sẵn để được sử dụng làm tên biến trong C nhưng làm cho trình biên dịch C++ bị ném lên. Trong C nó là hoàn toàn hợp pháp để sử dụng những lời sau đây là biến hoặc tên hàm, nhưng họ rõ ràng sẽ làm cho C++ ném một sự phù hợp hissy ...

  • mẫu
  • mới
  • lớp

Oh và "goto" hoạt động khác nhau trong C++ và C. Trong C++ "goto" không thể được sử dụng để nhảy qua khởi tạo của biến, nhưng đó là ok cho C. Cùng đi cho báo cáo chuyển đổi. Trong C bạn có thể viết một câu lệnh switch hoặc một tập hợp các goto mà sẽ không biên dịch trong C++.

Còn gì nữa? "strchr" hoạt động khác nhau trong C so với C++. Trong C nó trả về một con trỏ char. Trong C++, nó trả về một con trỏ char const. Nếu bạn sử dụng đầu ra đó từ strchr một cách nào đó trong C, nó có thể thổi khối trong C++ vì tính chính xác const của C++.

Chức năng nội tuyến được xử lý khác nhau.Trong C chúng được scoped vào tập tin, nhưng trong C + + họ có liên kết bên ngoài theo mặc định.

Mã C++ cần các nguyên mẫu chức năng được xác định bằng extern "C" để gọi đến hàm C.

C++ mangles biểu tượng tên hàm nhưng C thì không.

"Về lý thuyết không có sự khác biệt giữa lý thuyết và thực tiễn Trong thực tế có.." - Yogi Berra

+0

Tại sao một số downvoting? Có phải tôi đã phạm phải sai lầm? – Allbite

0

Tôi nghĩ rằng ví dụ contrived tôi sẽ cho bạn thấy lý do tại sao nó không phải là luôn luôn có thể:

#ifndef HEADER_H 
#define HEADER_H 
int class(int a, int b); 
int private(int a); 
#endif 

C hợp lệ hoàn toàn nhưng không được biên dịch trong C++, ngay cả với khối "C" bên ngoài. Theo như tôi biết cách duy nhất để sử dụng một thư viện C như thế là tạo một thư viện C khác gọi các hàm đó và sau đó sử dụng thư viện trình bao bọc đó trong mã C++ của bạn.

Điều đó nói rằng, tôi nghĩ vấp ngã khi một cái gì đó như thế này trong "thế giới thực" là khá hiếm.

+0

Để công bằng, không ai thực sự đặt tên cho các chức năng của chúng như vậy, nhưng điều này chứng minh rằng không phải tất cả các thư viện C đều tương thích. – dreamlax

+1

Nhưng nếu bạn biên dịch nó thành một lib với trình biên dịch c bạn có thể sử dụng thư viện trong C++ - tên mangling sẽ xử lý nó –

+0

@Martin - bạn sẽ sử dụng các hàm đó trong C++ như thế nào? –

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