2015-12-16 19 views
30

Bây giờ tôi đã quen thuộc với thư viện chuẩn C và C và tôi tự hỏi liệu kiến ​​thức của tôi trong lĩnh vực này có hữu ích không khi tôi chuyển sang làm việc với C++ sau. Vì vậy, tôi muốn biết, liệu tôi có thể sử dụng các chức năng được cung cấp bởi thư viện chuẩn C trong cài đặt C++ hay không và liệu tại sao nó có ý nghĩa để thực sự làm như vậy hay không.Có thể sử dụng các hàm từ thư viện chuẩn C trong C++ không?

+3

@moooeeeep: Lưu ý rằng bạn đã thay đổi ý nghĩa của OP. OP yêu cầu cho các thư viện chuẩn, là một xác định có. Trong khi sau khi chỉnh sửa, nó yêu cầu C-fucntions, câu trả lời là "Nó phụ thuộc vào chúng được thực hiện để làm như vậy." Tôi sẽ đề nghị reroll phần đó! – dhein

+1

@Zaibis Tôi nghĩ rằng nó có thể thú vị hơn khi đưa vào trường hợp tổng quát hơn, nhưng bạn nói đúng, OP hỏi cụ thể về thư viện chuẩn. Vui lòng xem lại bản chỉnh sửa thứ hai của tôi. – moooeeeep

+0

@moooeeeep: Tôi ổn với nó. Hy vọng rằng Nimit là tốt: P – dhein

Trả lời

48

Có, C++ được thiết kế ban đầu để mọi thư viện C có thể dễ dàng được sử dụng trong C++. Tất nhiên điều này là hơi kém đúng (đặc biệt, nếu một thư viện C xảy ra để sử dụng một số từ khóa C++ như try hoặc dynamic_cast, nó sẽ không hoạt động; ngoài ra, nếu một mã số trong C++ được chuyển vào thư viện C sẽ tăng lên một số ngoại lệ, bạn có thể có một mớ hỗn độn lớn).

Các tiêu chuẩn thực hành sử dụng một tập tin header C trong C++ là

extern "C" { 
#include <some_c_header_file.h> 
}; 

và hầu hết hiện tập tin tiêu đề C được thiết kế để hợp tác với C++ bởi thực sự có chứa những thứ như

#ifdef __cplusplus 
extern "C" { 
#endif 

//// most of the header material goes here, C style 

#ifdef __cplusplus 
}; // end extern "C" 
#endif 

Trong thực hành, nhiều tiêu đề C tiêu chuẩn có tiêu đề C++ tương đương gói những thứ như trên (và cũng có thể trong namespace std). Ví dụ: C <stdio.h> là C++ <cstdio> - nhưng bạn thường nên sử dụng các luồng C++ chính hãng (<iostream>), tuy nhiên, printf giống như thường lệ hơn localization thân thiện với hỗn hợp với gettext(3).

Tuy nhiên C và C++ là các ngôn ngữ khác nhau. Bạn nên mã trong thành ngữ C++ 11 (sử dụng tiêu chuẩn C++ containers, auto, closures, RAII, smart pointers, rule of five, SFINAE, exceptions, anonymous functions ...)

Một số chức năng tiêu chuẩn C không phải là rất hữu ích trong việc thành ngữ C++. Ví dụ: bạn không thể sử dụng trực tiếpmalloc trong chính hãng C++ (ít nhất là thích new - mức độ này vẫn rất thấp và không có nhiều trong tinh thần C++, nhiều khả năng sử dụng nhiều vùng chứa và con trỏ thông minh mà không cần xử lý thủ công với phân bổ đống). Nhưng các hàm POSIX (đặc biệt là syscalls(2) ....) khá hữu ích trong C++. longjmp có thể không tương thích với ngoại lệ C++.

BTW, C++ đã phát triển rất nhiều trong thế kỷ này. Không tìm hiểu C++ 98 nhưng ít nhất C++11 (có to lớn sự khác biệt giữa chúng) và có lẽ C++14. Sử dụng trình biên dịch gần đây (GCC hoặc Clang/LLVM); vào tháng 12 năm 2015, điều đó có nghĩa là ít nhất là GCC 5 ít nhất hoặc Clang/LLVM 3.7. Đừng quên để cho phép tất cả các cảnh báo & thông tin gỡ lỗi trong trình biên dịch (ví dụ g++ -Wall -Wextra -g -std=c++11)

C++ (đó có nghĩa là C++ 11 ít nhất) là một khó ngôn ngữ lập trình, đáng kể hơn phức tạp hơn so với C Là.Bạn sẽ cần hàng tuần đọc để học một số điều, và phong cách và kỷ luật mã hóa tốt là điều cần thiết (bạn có thể dễ dàng viết mã rất crappy trong C++). Hãy bắt đầu với Programming: Principles & Practice Using C++

Tôi tin rằng nếu bạn chỉ biết C, hãy đọc SICP (và nghiên cứu một chút sơ đồ) trước khi học học C++ là đáng giá.

Khái niệm về undefined behavior là rất quan trọng, cả trong C và thậm chí có thể nhiều hơn trong C++. Bạn hoàn toàn cần phải hiểu nó (xem C.Lattner's blog on it) và avoid nó.

Bạn cũng sẽ học được rất nhiều điều bằng cách nghiên cứu (và có thể đóng góp) một số mã hiện có free software và mã nguồn của nó. Do đó tôi khuyên bạn nên sử dụng Linux.

+1

Và nếu bạn muốn sử dụng thư viện C, ví dụ: một trường struct có tên 'try', bạn có thể chỉ cần' #define thử try_' hoặc tương tự trước khi bạn '# include' nó. –

+3

@Claudio Các đối tác C++ được sử dụng chủ yếu để chèn các ký hiệu vào không gian tên 'std ::', không thêm 'extern" C "{'. Ít nhất là trên máy tính của tôi, nó hoạt động hoàn toàn tốt đẹp để bao gồm tất cả các tiêu đề C tiêu chuẩn trực tiếp, chèn các biểu tượng vào không gian tên chung. – cmaster

+0

Thật không may, đôi khi không có C++ (11) tương đương trong thư viện chuẩn, ví dụ, arithmetics với ngày (http://stackoverflow.com/a/15669430/1025391) – moooeeeep

20

Tôi sẽ trích dẫn một đoạn trong tiêu chuẩn ISO/IEC N3690 (tiêu chuẩn C++).

17,2 Tiêu chuẩn C thư viện

1 C++ thư viện chuẩn cũng làm cho có sẵn cơ sở vật chất của thư viện chuẩn C, phù hợp điều chỉnh để đảm bảo an toàn kiểu tĩnh.

Vì vậy, đơn giản là có!

0

có .Bạn có thể sử dụng chức năng thư viện c chuẩn trong C++ Ví dụ

stdio.h => cstdio (printf/scanf) 
    math.h => cmath  (sqrt) 
Các vấn đề liên quan