2012-02-25 41 views
16

Tại sao thiết lập kiểu trả về của điểm vào là void trong C++ luôn bị nản chí, và sau đó bị loại bỏ theo tiêu chuẩn và bị cấm bởi trình biên dịch hiện đại? Tại sao nó được coi là thực hành xấu?Điều gì đã sai với void main()?

Bây giờ, như tôi hiểu C# và Java cả hai phép kiểu trả về điểm mấu chốt để có void tức là

static void main(String[] args) /* Java */ 
static void Main(string[] args) /* C# */ 

Và C# và lập trình viên Java không xem xét nó xấu thực tế, họ sử dụng nó thường xuyên trong thực tế.

Các ngôn ngữ khác (chỉ dự định là, tôi nghi ngờ C++ sẽ thành công trong thập kỷ này, ít nhất) người kế thừa có thể của C++ như Ngôn ngữ lập trình D hoặc Vala cũng cho phép void main(). Như bạn có thể thấy, tôi nghi ngờ cộng đồng C++ đã xóa nó khỏi tiêu chuẩn vì nó quá tối nghĩa hoặc không phổ biến.

Vì vậy, câu hỏi của tôi là, Tại sao Cộng đồng C++ xóa void main()? Nó gặp vấn đề gì vậy?

+1

Nhà thiết kế ngôn ngữ khác nhau đưa ra các quyết định khác nhau. Tại sao nó lại quan trọng? –

+0

@GregHewgill Tôi hiểu điều đó. Nhưng những yếu tố và lý do khiến các nhà thiết kế C++ đưa ra quyết định họ đã làm là gì? – ApprenticeHacker

+1

Trực tiếp từ miệng ngựa: http: //www2.research.att.com/~bs/bs_faq2.html#void-main :) –

Trả lời

10

Ủy ban tiêu chuẩn C++ có thể đã chọn yêu cầu int main() vì phần lớn mã hiện có dự kiến ​​sử dụng câu lệnh return để trả lại mã thoát cụ thể cho hệ thống thời gian chạy. Nó sẽ là không hợp lý để mong đợi tất cả các mã hiện có để thay đổi để sử dụng exit() thay vào đó, do đó, int main() đã được thực hiện một yêu cầu trong tiêu chuẩn.

Một ngôn ngữ như Java, khi ngôn ngữ được thiết kế, không có bất kỳ phần nào của mã hiện có mà nó cần để duy trì tương thích. Do đó, các nhà thiết kế có thể chọn void main() và yêu cầu sử dụng System.exit() cho các mã thoát khác không. Vì vậy, điều sẽ là "sai" với việc chọn void main() cho tiêu chuẩn C++ sẽ là nó sẽ phá vỡ mã hiện tại mà dự kiến ​​sẽ sử dụng return và giá trị mã thoát từ main().

+1

Tôi hiểu. Vì vậy, họ đã chọn 'int main()' để tương thích với mã hiện có. lol, tôi nên biết ...: D – ApprenticeHacker

+2

Tôi đã không tham dự các cuộc họp tiêu chuẩn C++ đầu nhưng tôi nghi ngờ rằng ủy ban thực sự chọn bất cứ điều gì: việc sử dụng một giá trị trả về là một phần của C++ ngay từ khi bắt đầu vì nó có nghĩa là về cơ bản là phần mở rộng của C. C về cơ bản cũng được sử dụng để trả về 'int' (mặc dù thường được khai báo ngầm định: bạn có thể bỏ' int' ban đầu và trình biên dịch sẽ giả định rằng đây là ý của bạn) để có cách tự động nói nếu một chương trình thành công. Nếu kết quả của một chương trình là 'void', điều này không đưa ra bất kỳ dấu hiệu nào cho dù nó đã thành công hay không. –

8

Bạn thường muốn biết trạng thái thoát của chương trình của mình. Đó là lý do tại sao bạn có số int main() - bạn trả lại trạng thái thoát.

3

Điều này không đúng vì đây không phải là tiêu chuẩn C++ chỉ định là main hợp pháp. Không ai quan tâm về những gì các ngôn ngữ khác chỉ định. Đối với các chương trình C++, chỉ có tiêu chuẩn C++ là có liên quan, và nó nói int.

+2

Câu hỏi, nói cách khác, là tại sao nó lại nói vậy? –

+0

@Soufiane: Câu hỏi hỏi tại sao nó không hợp lệ # – Puppy

+1

_Đó là sai vì đây không phải là những gì C++ Standard chỉ định_ ... _only C++ Standard là related_. lol, từ này tôi thu thập rằng 'C++ Standard == Divine Testament mới nhất ' – ApprenticeHacker

10

C++ có không bao giờ được phép void main(), mặc dù một số trình biên dịch có thể cho phép tiện ích mở rộng hoặc chỉ vì chúng không chẩn đoán được.

Tương tự, C chưa bao giờ cho phép void main() ngoài tiện ích mở rộng; cùng một tiêu chuẩn năm 1989 đã giới thiệu từ khóa void được xác định hai định nghĩa chuẩn cho main: int main(void)int main(int argc, char *argv[]).

Các ngôn ngữ khác cho phép bởi vì, tốt, chúng là các ngôn ngữ khác.

Không có lợi thế cụ thể nào khi có thể viết void main() thay vì int main(). Bạn thậm chí không cần phải trả về một giá trị một cách rõ ràng; rơi xuống cuối main tương đương với return 0; (bằng C++ và trong C bắt đầu bằng C99).

+0

+1 cho sự kiện. Tuy nhiên, trong khi nó chưa bao giờ được cho phép, ngay cả bản thân Bjarne Stroustrup cũng đã viết 'void main', cụ thể là trong ấn bản thứ hai (và cũng có thể trong lần đầu tiên, tôi không kiểm tra) của "Ngôn ngữ lập trình C++". Nó chỉ là một điều meme, giống như nhiều công ước tùy ý khác và thường không được chấp nhận. –

+0

@ Cheersandhth.-Alf: Tôi vừa kiểm tra ấn bản thứ hai (in thứ 9, tôi nghĩ) của TC++ PL, và không thấy bất kỳ tham chiếu nào tới 'void main()' - mặc dù có ít nhất một lần xuất hiện 'main()' với kiểu trả về 'int' ẩn (ngôn ngữ không còn cho phép). Tôi đã kiểm tra tất cả các tham chiếu đến 'main' từ chỉ mục. Nó đã được sửa chữa trong ấn bản tôi có hay tôi đã bỏ lỡ điều gì đó? –

+1

Cũng giống như bạn bây giờ, Bjarne có chút hoài nghi về tuyên bố rằng ông đã làm bất cứ điều gì như thế, vào năm 2006. Xem ví dụ [http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be](http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be), nơi tôi đã trả lời "Ví dụ đầu tiên tôi tìm thấy bây giờ ở phần cuối của phần 7.3.2, trang 233". Tôi không có cuốn sách đó ở đây và bây giờ, nhưng tôi cho rằng ref của riêng tôi là chính xác. :-) –

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