Có vấn đề gì theo cách tôi khai báo chương trình C++ của tôi?Sự khác biệt giữa chính void và int chính?
Trả lời
Sự khác biệt là một cách chính xác để xác định main
và cách khác là không.
Và có, nó không quan trọng.
int main(int argc, char** argv)
hoặc
int main()
là định nghĩa đúng đắn của bạn main
mỗi C++ spec.
void main(int argc, char** argv)
không phải là và đã, IIRC, một sự hư hỏng đi kèm với trình biên dịch C++ của Microsoft.
Đối với C++, chỉ cho phép int. Đối với C, C99 chỉ cho phép int được cho phép. Tiêu chuẩn trước cho phép trả lại khoảng trống.
Tóm lại, luôn luôn int.
Trả về một int cũng được yêu cầu cho C89. –
Thực ra, C89 là mơ hồ tùy thuộc vào cách bạn đọc nó. Thú vị đọc ở đây: http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – Joe
rằng liên kết không chịu được, int là kiểu trả về bắt buộc trong C89 và C99 nếu bạn muốn các chương trình có thể di chuyển. –
Nếu bạn đang đi theo thông số kỹ thuật, thì bạn phải luôn khai báo chính là int. Tuy nhiên, trong thực tế, hầu hết các trình biên dịch sẽ cho phép bạn thoát ra với một trong hai, vì vậy sự khác biệt thực sự là nếu bạn muốn/cần trả về một giá trị cho trình bao.
Bạn nên luôn luôn cố gắng làm những điều "theo thông số kỹ thuật" trừ khi có lý do thuyết phục không. Cấp, rất nhiều triển khai cho phép chính trống và các tiện ích mở rộng khác. Điều này không có nghĩa là bạn nên dựa vào các tiện ích mở rộng cụ thể triển khai. Trong các ứng dụng nhúng, không có shell, void main là ok. – Trent
Tôi sẽ tiếp tục và đồng ý với tất cả điều đó. Trong một thời gian, tôi đã có thói quen sử dụng void vs int như một loại pesudo-comment về việc liệu tôi có hy vọng trả về một giá trị hay không, nhưng bây giờ tôi chỉ sử dụng int. –
Tại sao có giá trị trong việc làm điều sai (điều này xảy ra trong một số trường hợp), khi điều đúng là công việc nhiều hơn? – Tom
Vấn đề là, các chương trình C (và C++ giống nhau) luôn luôn (nên?) Trả lại giá trị thành công hoặc mã lỗi, vì vậy chúng sẽ được khai báo theo cách đó.
Một thời gian dài trước đây tôi tìm thấy this page (void main(void)) có chứa nhiều lý do bên ngoài đối số "tiêu chuẩn cho biết nó không hợp lệ". Trên các hệ điều hành/kiến trúc cụ thể, nó có thể khiến cho ngăn xếp bị hỏng và những thứ khó chịu khác xảy ra.
Trong C++, main()
phải trả lại int
. Tuy nhiên, C99 cho phép main()
có loại trả về không int
. Đây là trích đoạn từ tiêu chuẩn C99.
5.1.2.2.1 khởi động Chương trình
Chức năng gọi lúc khởi động chương trình được đặt tên chính. Việc triển khai tuyên bố không có nguyên mẫu cho chức năng này.Nó được định nghĩa với một kiểu trả về của int và không có thông số:
int main(void) { /* ... */ }
hoặc với hai tham số (gọi tắt ở đây là argc và argv, mặc dù bất kỳ tên chưa sử dụng, vì chúng là địa phương để các chức năng, trong đó họ được khai báo):
int main(int argc, char *argv[]) { /* ... */ }
hoặc tương đương; hoặc theo một số cách thức được thực hiện khác.
Cũng lưu ý rằng gcc thực hiện biên dịch void main()
mặc dù thực tế, nó thực hiện return 0;
khi gặp phải dấu ngoặc đóng.
'gcc -pedantic' sẽ loại bỏ nó. Và không sử dụng '-pedantic' chỉ là sai lầm. –
Đồng ý, nhưng tôi đã sử dụng gcc chỉ làm ví dụ vì nó có lẽ là trình biên dịch phổ biến nhất. Tiêu chuẩn rõ ràng cho phép một kiểu trả về không phải int cho hàm main() trong C99, theo văn bản mà tôi đã tô đậm. –
Nếu bạn dựa vào hành vi được xác định thực hiện, thì chương trình của bạn không phù hợp với tiêu chuẩn. Trình biên dịch của bạn có thể chấp nhận nó, nhưng nó không hợp lệ C99, chỉ foo-C99. – Jed
Bjarne Stroustrups làm này khá rõ ràng:
"Định nghĩa void main()
không và không bao giờ đã là C++, cũng đã thậm chí nó được C."
- 1. Sự khác biệt chính xác giữa rvalue và lvalue
- 2. sự khác biệt giữa int * i và int * i
- 3. Sự khác biệt thực sự giữa "int" và "unsigned int"
- 4. Sự khác biệt chính giữa Sinatra và Ramaze là gì?
- 5. Sự khác biệt chính giữa Amazon S3 và Amazon EBS
- 6. Sự khác biệt giữa int * i và int ** i
- 7. sự khác biệt giữa "void 0" và "không xác định"
- 8. Mục tiêu-C: sự khác biệt giữa id và void *
- 9. Sự khác biệt giữa int, NSInteger và NSUInteger
- 10. Sự khác biệt giữa 'độ chính xác' và 'độ chính xác' là gì?
- 11. + (void) hoặc - (void) khác biệt?
- 12. Sự khác biệt giữa dài và int trong C#?
- 13. sự khác biệt giữa lâu dài và dài int
- 14. C: sự khác biệt giữa (int) x và tầng (x)?
- 15. Sự khác biệt về PHP giữa int và số nguyên
- 16. Sự khác biệt giữa = và: =
- 17. Sự khác nhau chính giữa signcode.exe và signtool.exe là gì?
- 18. Sự khác nhau chính giữa API Web và ASP MVC
- 19. Sự khác biệt giữa $ * và $ @
- 20. Sự khác biệt giữa đặc điểm kỹ thuật và chính sách?
- 21. SIMD và sự khác biệt giữa độ chính xác kép được đóng gói và vô hướng
- 22. Sự khác biệt giữa mảng int * và mảng int [] trong tham số hàm
- 23. Sự khác nhau giữa int [] array và int array []
- 24. Sự khác biệt giữa mảng/chuỗi int/char
- 25. Sự khác biệt giữa các giao thức chính thức và không chính thức trong Objective-C là gì?
- 26. Sự khác biệt giữa .dll và .exe?
- 27. sự khác biệt giữa cacao và cocoatouch
- 28. Sự khác biệt giữa $ (...) và `...`
- 29. Sự khác biệt giữa. và #
- 30. Sự khác biệt giữa ". +" Và ". +?"
int main (void) cũng là thích hợp – Trent
Trên thực tế, trong khi đó không quan trọng, tôi nghĩ int main() được ưa chuộng hơn int main (void) – Alan
Họ là những * tối thiểu * yêu cầu cho các đối số (và đó là "char * argv []", không phải "char ** argv"). Các triển khai được cho phép rõ ràng để cung cấp nhiều biểu mẫu hơn. Loại trả về int, tuy nhiên, không thể thương lượng khi bạn nói. – paxdiablo