2011-10-15 85 views
8

Tôi đang thử nghiệm một số đoạn trích mà tôi đã tìm thấy trên web bằng cách sử dụng g + + từ MinGW. Đây là trình biên dịch C++ ... tại sao sau đó nó biên dịch đúng C .... tại sao mọi người đan xen C và C++.Khi nào nên dùng printf/scanf vs cout/cin?

Câu hỏi cụ thể là: Có phải O.K. để sử dụng cả C và C++ và biên dịch theo g ++. Nếu câu trả lời là có, điều này làm cho cuộc sống của tôi dễ dàng như tôi không phải sửa đổi mã.

Lạ lùng thay ... để có được một số C++ để làm việc, đặc biệt là khi đi qua một chuỗi đến một constructor ifstream nó đòi hỏi một chuỗi loại C ...

Tôi đoán sẽ là vì C++ phụ thuộc vào C xây dựng tại thời gian là OK để viết hai ngôn ngữ với nhau.

Tuy nhiên, dưới dạng kiểu dáng bạn nên giải quyết trên cout/cin hoặc printf/scanf.

+0

C về bản chất là một tập con của C++. Vào thời điểm C++ xuất hiện có các mã của mã trong C (vẫn còn), do đó bạn không thể mong đợi làm cho hai ngôn ngữ không tương thích. – FailedDev

+1

Lưu ý: như C++ 11, bạn cũng có thể xây dựng một 'std :: ifstream' từ' const std :: string & '(ví dụ xem phần 27.9.1.7 của [last draft] (http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)). – reima

Trả lời

5

Có một vài điểm kỳ lạ khi cần char*. Bạn có thể thu hẹp khoảng cách bằng cách sử dụng phương thức .c_str() của số std::string để nhận khoảng cách.

Đối với hầu hết các phần, tập con C của C++ tương thích. Chính xác như nó không tương thích là không có khả năng quan trọng đối với hầu hết các phần:

http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

Nếu bạn đang biên soạn đoạn mã C dưới một trình biên dịch C++, hãy chắc chắn để thay đổi nó để sử dụng "c "định dạng lib trong bao gồm của bạn ...ví dụ #include <cstdio> thay vì #include <stdio.h>

Is it bad practice to use a C header instead of its C++ equivalent in C++ (e.g. stdio.h instead of cstdio)?

Đối với một cuộc tranh luận khá lý từ Bjarne mình về việc tại sao để tránh scanf, hãy kiểm tra đầu bài viết này:

http://www2.research.att.com/~bs/new_learning.pdf

Có rất nhiều lợi ích khi sử dụng iostream thay vì printf:

'printf' vs. 'cout' in C++

+0

Cũng lập luận của ông về printf và scanf dường như hoàn toàn tập trung vào scanf. Sử dụng printf so với cout là rất nhiều vấn đề của ý kiến, vì cả hai đều có lợi thế và bất lợi. Việc định dạng nội dung với luồng là phức tạp hơn mức cần thiết và khía cạnh OOP của luồng có thể ẩn các lỗi (ví dụ: 'cout << this' so với' cout << * this'). – Voo

+0

Được cập nhật bằng liên kết hỗ trợ cho lý do không sử dụng-printf. Nó không quan trọng * nhiều *, đúng vậy. Nhưng tôi vẫn nghĩ rằng khái niệm sử dụng một ngôn ngữ định dạng nhỏ không được kiểm soát trong một chuỗi là chống đối với tinh thần C++. Đó là loại tương tự như trường hợp tôi đã nhìn thấy nơi một người nào đó thực hiện một "định dạng XML" đó là một chút tiêu đề và các đốm màu lớn của CDATA. Tại thời điểm đó bạn đang ở trong một tệp .XML * * nhưng dữ liệu của bạn không thực sự là "XML". Tương tự nếu bạn đang "lập trình bằng ngôn ngữ printf" và bỏ qua hệ thống kiểu C++ và không cho phép mọi thứ được kiểm tra tại thời gian biên dịch. – HostileFork

+0

Tôi không chắc chắn nếu an toàn kiểu là nhiều đối số xem xét rằng luồng chấp nhận khá nhiều bất cứ điều gì, vì vậy bạn vẫn có thể nhận được kết quả không mong muốn dễ dàng. Ngoài ra gcc làm cho các danh sách đối số không phù hợp ít hơn của một vấn đề (nó vẫn còn, đặc biệt là trên các trình biên dịch khác). Có thể kế thừa i/ostream là tốt đẹp trong một số tình huống không có nghi ngờ. Một số người thích cú pháp hơn một cú pháp khác, vì vậy đó không phải là một lợi thế cho cái này hay cái kia. Một điều mà tôi ghét là các luồng trong C++ là khả năng định dạng của chúng. Chỉ cần cố gắng làm một cái gì đó như '%. * S' hiệu quả với các luồng. – Voo

0

Nếu bạn sử dụng C++, hãy sử dụng C++. (cin, cout)
Tại sao fstream cũng lấy c chuỗi câu đố cho tôi.

2

Có phải O.K. để sử dụng cả C và C++ và biên dịch theo g ++.

Có, kết hợp hai ngôn ngữ là tốt. Điều này là phổ biến với mã mà bắt đầu như C, nhưng sau đó nhận được nhiều hơn và nhiều hơn nữa các tính năng C++ thêm (rõ ràng là ai đó thay đổi trình biên dịch trên đường đi).

Nói chung, mã C sẽ biên dịch và chạy bằng trình biên dịch C++. Có nhiều ngoại lệ có thể xảy ra, chẳng hạn như sử dụng các từ khóa như classvirtual cho tên của những thứ trong mã C hoặc quy tắc truyền thoải mái của C.

Bạn thường sẽ nghe mọi người nói "họ là những ngôn ngữ rất khác nhau". Đó là vì bất kỳ câu hỏi lập trình nào bạn hỏi có thể có một câu trả lời khác tùy thuộc vào ngôn ngữ bạn đang cố sử dụng. Tuy nhiên, có rất nhiều điểm tương đồng và các khía cạnh tương thích ngược.

+1

Không thực sự. Có những thứ trong C sẽ không biên dịch thành C++. –

+0

@CatPlusPlus: Tôi đã cập nhật câu trả lời của mình với giải thích thêm. –

3

Ngôn ngữ C++ thừa hưởng nhiều chức năng cốt lõi của nó từ C. Đó là vì C++ được bắt nguồn từ C. Tiêu chuẩn C++ bao gồm, bằng cách tham khảo phần lớn của tiêu chuẩn C. Vì vậy, bạn có thể sử dụng trình biên dịch C++ để viết mã bằng cách sử dụng các cấu trúc C, thành ngữ và các mô hình. Làm như vậy thường được gọi là sử dụng C++ "như một C. tốt hơn"

Dài và ngắn gọn ở trên là có, bạn có thể sử dụng printf trong mã C++. Làm như vậy được cho phép một cách rõ ràng bởi tiêu chuẩn.

Thực hiện việc này tuy nhiên thường bỏ qua nhiều tính năng xác định C++. Tôi sẽ để lại cuộc trò chuyện đó cho một câu hỏi khác nhưng đủ để nói rằng nhiều người sẽ nói với bạn chỉ đơn giản là "không làm điều đó" hoặc "đó không phải là C++." Điều này đặt sang một bên những lý do tại sao bạn có thể không muốn sử dụng printf trong một chương trình C++ hoặc thực sự là lý do tại sao bạn muốn. Nhưng hãy yên tâm rằng nó được cho phép về mặt kỹ thuật.

+0

Đăng từ một nắm tay. Nhiều lỗi chính tả. Lấy làm tiếc. –

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