2009-03-11 99 views

Trả lời

59

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.

https://isocpp.org/wiki/faq/newbie#main-returns-int

+2

int main (void) cũng là thích hợp – Trent

+9

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

+2

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

8

Đố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.

+3

Trả về một int cũng được yêu cầu cho C89. –

+0

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

+0

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. –

11

Bạn nên sử dụng int chính. Cả hai tiêu chuẩn C và C++ xác định rằng chính nên trả về một giá trị.

+0

Nó sẽ trả về 0 như trả về 0; – Kensai

+0

tôi muốn hỏi rằng ai sẽ trả lại giá trị? – Vinay

+0

@Vinay: Để thực hiện bất kỳ chương trình nào của bạn (thường là hệ điều hành). – Alan

2

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.

+0

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

+0

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. –

+0

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

4

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 đó.

2

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.

3

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.

+6

'gcc -pedantic' sẽ loại bỏ nó. Và không sử dụng '-pedantic' chỉ là sai lầm. –

+0

Đồ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. –

+0

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

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