Tại sao #include <iostream.h> xấu?


47

Tôi đang đọc một chủ đề khác , nơi một chàng trai hỏi về sách C ++ cho người mới bắt đầu, và một trong những lập trình viên trả lời đã viết điều này:

Một số cảnh báo: tránh tất cả các sách có nội dung "thế giới xin chào"

#include <iostream.h>

Tôi đã mở cuốn sách C ++ của mình và chắc chắn nó bao gồm tiêu đề iostream như ví dụ trên.

Tại sao điều đó là xấu? Những lưu ý nào khác tôi nên ghi nhớ khi học C ++?

Bối cảnh: Tôi thành thạo C và tôi sẽ bắt đầu học C ++ trong học kỳ tiếp theo.


3
Một con trỏ khác có liên quan, bao gồm cstdio, không bao gồm stdio.h(cái sau bị phản đối).
Anton Golov

7
@AntonGolov Ý kiến ​​khác nhau. Nhiều chuyên gia thích <stdio.h> vì không có lý do kỹ thuật tại sao nên chọn <cstdio>.
Sjoerd

2
@Sjoerd Thực tế <cstdio>được đảm bảo cung cấp tên trong namespace stdlà đủ lý do để tôi thích nó. Tôi biết rằng nó cũng có thể cung cấp cho họ trong không gian tên toàn cầu giống như <stdio.h> có thể cung cấp cho họ namespace std. Đó cũng là một vấn đề nhất quán nếu bạn tạo thói quen luôn sử dụng các <c…>tiêu đề. Và đối với một số tiêu đề, bạn sẽ thực sự muốn điều này bởi vì chúng tăng cường giao diện C với quá tải chức năng bổ sung, chẳng hạn.
5gon12eder

Câu trả lời:


58

Tiêu đề iostream.h là một tiêu đề không chuẩn và không tồn tại trên tất cả các nền tảng. Vì thực tế nó không tồn tại trên hệ thống của tôi (sử dụng g ++ và GNU libstdc ++). Vì vậy, bất kỳ mã nào sử dụng nó sẽ không biên dịch trên hệ thống của tôi.

Các iostream.htiêu đề sử dụng để được phổ biến trước khi C ++ lần đầu tiên được tiêu chuẩn hóa vào năm 1998. Tuy nhiên, kể từ khi tiêu chuẩn 98 sử dụng <iostream>thay vì <iostream.h>, sau này đã giảm trên ưu tiên (là phi tiêu chuẩn và tất cả) và không còn được hỗ trợ trên tất cả các nền tảng. Mã sử ​​dụng nó phải được coi là mã kế thừa không chuẩn và không thể mang theo được. Những cuốn sách dạy nó nên được coi là lỗi thời và tránh.


14
Tôi sẽ không tránh khỏi một cuốn sách hoàn toàn chỉ vì một vấn đề cú pháp tiền xử lý tầm thường. Nó có thể là một cuốn sách tuyệt vời trong khi một cuốn sách khủng khiếp có thể sử dụng cú pháp hiện đại.
Lord Tydus

21
@Lord Tydus Thực tế là bất kỳ cuốn sách trước 98 nào cũng có thể là một cuốn sách tuyệt vời không phủ nhận thực tế là về mặt thống kê, bạn sẽ tốt hơn nên tránh những cuốn sách trước 98.
Mike Nakis

12
@LordTydus: Hoàn toàn không đồng ý. Phong cách và cách sử dụng của C ++ không giống như trong 98 do đó nó không chỉ khắc phục các vấn đề cú pháp.
Martin York

7
@LordTydus Nếu cú ​​pháp cũ đơn giản và không biên dịch trên các trình biên dịch hiện đại, bạn sẽ gặp khó khăn khi sử dụng một cuốn sách dạy cú pháp cũ. Lưu ý rằng bất kỳ cuốn sách nào dạy cách sử dụng iostream.h gần như chắc chắn không dạy ví dụ như không gian tên, vì vậy ngay cả sau khi thay thế iostream.h bằng iostream, mã của bạn sẽ không hoạt động. Nếu bạn phải google hoặc yêu cầu trợ giúp về SO mỗi khi bạn muốn biên dịch một ví dụ từ cuốn sách, đó không phải là cách rất hiệu quả để học C ++.
sepp2k

3
@LordTydus: Nói chung, tôi đã phát hiện ra rằng những cuốn sách sử dụng các tiêu đề như thế cũng có xu hướng sử dụng các thực tiễn xấu và bị sai sót. Tôi đã thu thập những cuốn sách như vậy chỉ để giữ cho chúng không được lưu hành.
greyfade

55

#include <iostream.h>là một dấu hiệu cho thấy cuốn sách được viết trước tiêu chuẩn C ++ đầu tiên vào năm 1998 (tiêu đề tiêu chuẩn là iostream).

Vấn đề là mã C ++ cũ hơn có xu hướng được viết theo những cách được coi là thực tiễn xấu hiện nay. Đặc biệt,

  • Việc sử dụng mảng kiểu C thay vì các lớp container như std::stringstd::vector.
  • Việc sử dụng các closechức năng rõ ràng hơn là RAII.

iostream.hkhông phải là điều tồi tệ nhất mà một cuốn sách trước năm 1998 sẽ bị sai, nhưng nó có thể là điều đầu tiên mà một cuốn sách trước năm 1998 sẽ bị sai.


14
Đóng đinh nó với đoạn cuối cùng của bạn.
Cuộc đua nhẹ nhàng với Monica

1

Có thể điều này đến hơi muộn nhưng với những gì đáng giá, trên hộp unix / linux làm ls /usr/{local/,}include/c++/*hoặc tương tự, theo bố cục và đường dẫn của bạn. Bạn có thể greptìm kiếm tiêu đề trong câu hỏi, như:

ls /usr/{local/,}include/c++/* | grep iostream 

Điều này đòi hỏi phải tìm kiếm iostream.hcũng như bất kỳ siêu phẩm nào khác.

Hoặc chạy find / -type f -name iostream 2> /dev/null | grep includehoặc locate iostream | grep include(với điều kiện là cơ sở dữ liệu hiện tại, nếu không thì hãy gọi trước updatedb) - tuy nhiên, những thứ này sẽ in ra cả hệ thống không bao gồm toàn hệ thống, vì vậy vui lòng điều chỉnh phù hợp. Đường dẫn C ++ thực tế dễ dàng được tìm thấy với một cái gì đó như:

g++ -v 2>&1| sed -rn 's/.+gxx-include[^=]+=([^ ]+).+/\1/p' # adjust iff empty

Tương đương trên Windows và các máy khác. Tôi đoán ý tưởng đã rõ ràng - một tệp iostream.hkhông tồn tại trong hệ thống bao gồm đường dẫn theo mặc định nữa, tuy nhiên, bạn vẫn có thể tìm thấy các bản phân phối libc ++ cũ với iostream.hliên kết mềm iostreamhoặc như bản sao của nó. Vì vậy, đây không phải là vấn đề về phong cách mà là hoàn cảnh. Bạn có thể giao hàng của riêng bạn iostream.hvới dự án của bạn chỉ cần đảm bảo rằng nó được chứa trong đường dẫn bao gồm nơi trình biên dịch của bạn tìm kiếm các <...>tiêu đề.


1
Rất thực tế nhưng không thực sự giải quyết được điểm cơ bản thực sự.
Cuộc đua nhẹ nhàng với Monica

-1

Chỉ cần thả 2 xu của tôi. Tôi không nghĩ có mối tương quan giữa ".h" và chất lượng của một cuốn sách. Đây là một vấn đề cú pháp nhỏ. Ngày trước, nó thực sự là sytnax chính xác.

Có thể có một cuốn sách tuyệt vời với iostream.h? Đúng

Có thể có một cuốn sách khủng với iostream? Đúng

Tôi sẽ dựa vào đánh giá của người dùng trực tuyến (và đánh giá của riêng tôi sau khi đọc) để đánh giá chất lượng của một cuốn sách.


3
Vấn đề là, bạn có chắc chắn muốn một cuốn sách từ "trở lại trong ngày?"
hugomg

5
Là Lisp lỗi thời bởi vì nó từ năm 1958? Chúng tôi sử dụng công việc của Pythagoras trong mọi hệ thống tên lửa hiện đại mặc dù toán học đã có hàng nghìn năm. Trong thị trường sách C ++ hiện tại, sách ".h" có thể rất tệ. Nhưng đó là vấn đề chất lượng của sách chứ không phải vấn đề ".h". ".h" thậm chí không lập trình logic, nó dành cho bộ tiền xử lý.
Lord Tydus

4
nhưng ai đó lần đầu tiên học ngôn ngữ sẽ biết khi cuốn sách nói với họ điều gì đó không đúng? Họ sẽ trải qua bao nhiêu thời gian và thất vọng trước khi phát hiện ra rằng ".h" không chính xác? Và trong bao nhiêu cách khác là cuốn sách đã lỗi thời?
Chris Pitman

23
Vấn đề là việc sử dụng C ++ đã thay đổi đáng kể kể từ khi những cuốn sách đó được viết. Toàn bộ cách bạn nghĩ và sử dụng C ++ không giống như những cuốn sách sẽ trình bày vì chúng không có bất kỳ phương tiện nào mà C ++ hiện đại có. Kết quả là bạn sẽ tự dạy mình C với các lớp không phải C ++.
Martin York

3
@Giorgio: Chán. Thế còn ACRE. Nâng cao C trên Ritalin với Ngoại lệ. Acre cũng ngụ ý nó bao phủ rất nhiều mặt đất. :-)
Martin York
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.