2013-08-26 50 views
20

Tôi đã học lập trình C theo kiểu tự học trong một vài tuần và có một số câu hỏi mà tôi có liên quan đến hàm main().Hàm main() trong C

  1. Tất cả các chức năng phải được khai báo trong mẫu thử chức năng của chúng và sau này, trong trạng thái của chúng. Tại sao chúng ta không phải khai báo hàm main() trong một nguyên mẫu đầu tiên?

  2. Tại sao chúng ta phải sử dụng int main() thay vì void main()?

  3. Trả về 0 chính xác trong hàm main() là gì? Điều gì sẽ xảy ra nếu tôi đã viết một chương trình kết thúc hàm main() với return 1;, chẳng hạn?

+6

'main()' thậm chí còn có riêng [trang Wikipedia] của nó (http://en.wikipedia.org/wiki/Main_function) –

+7

1) là sai - nguyên mẫu không phải là "phải" – aragaer

+2

@ user2718426 Thủ trưởng, 'làm tròn những phần này, chúng tôi muốn giữ cho mỗi câu hỏi chỉ với một câu hỏi tại một thời điểm. Vì vậy, bài đăng của bạn có vẻ như ba câu hỏi. Mặc dù bạn sẽ tìm thấy rất nhiều bài viết về lần thứ hai, như http://stackoverflow.com/questions/9356510/int-main-vs-void-main-in-c –

Trả lời

14
  1. Bạn cần hoặc một định nghĩa hay một nguyên mẫu để gọi đúng chức năng, nhưng không được gọi main từ bất kỳ chức năng nào khác, do đó, không được khai báo.
  2. Vì tiêu chuẩn C nói như vậy. Các hệ điều hành truyền giá trị trả về cho chương trình gọi (thường là trình bao). Một số trình biên dịch sẽ chấp nhận void main, nhưng đây là một phần mở rộng không chuẩn (nó thường có nghĩa là "luôn luôn trả về số không cho hệ điều hành").
  3. Theo quy ước, một giá trị trả về khác không cho biết có lỗi xảy ra. Shell script và các chương trình khác có thể sử dụng nó để tìm hiểu xem chương trình của bạn đã kết thúc thành công hay chưa.
0

1) đó là sai, bạn chỉ có thể tạo ra defintion của hàm.

2) chúng ta có thể biết nếu() Chức năng chính một cách chính xác chấm dứt

3) cùng ngoại trừ trong vỏ của nó sẽ được lớn không lành mạnh 1 thay vì 0

15

1) Tất cả các hàm phải được khai báo trong nguyên mẫu hàm của chúng và sau này, trong định nghĩa của chúng. Tại sao chúng ta không phải khai báo hàm main() trong một nguyên mẫu đầu tiên?

Không đúng sự thật. Ví dụ đơn giản:

void foo(){} //definition 

int main() 
{ 
    foo(); 
    return 0; 
} 

Chỉ khi một hàm được gọi nhưng định nghĩa chưa được nhìn thấy, cần phải khai báo. Điều đó sẽ không bao giờ xảy ra với main vì nó là phần khởi động của chương trình.


2) Tại sao chúng ta phải sử dụng int main() thay vì void main()?

Vì tiêu chuẩn nói như vậy. (Để chính xác hơn, điều đó đúng với môi trường được lưu trữ, thường là như vậy)

C99 5.1.2.2.1 Khởi động chương trình

Chức năng được gọi lúc khởi động chương trình có tên main. 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à argcargv, mặc dù bất kỳ tên có thể sử dụng, vì họ là địa phương để các chức năng mà chúng đượ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 thực hiện khác.


3) gì return 0 chính xác làm trong chính function()? Điều gì sẽ xảy ra nếu tôi đã viết một chương trình kết thúc hàm main() với trả về 1, chẳng hạn?

Giá trị trả lại cho biết kết quả của chương trình. Thông thường, 0 cho biết thành công trong khi các giá trị khác cho biết các loại lỗi khác nhau.

1

1) Không nhất thiết; một định nghĩa cũng đóng vai trò như một tuyên bố. Thứ hai, chỉ có một vài chữ ký hợp lệ cho main, và bạn thường sẽ không gọi main trong mã của bạn trừ khi bạn đang viết một mục nhập cho IOCCC.

2) Câu trả lời ngắn: vì định nghĩa ngôn ngữ cho biết. Câu trả lời dài hơn: đây là cách chương trình của bạn cho biết thành công hay thất bại đối với môi trường máy chủ. Việc triển khai cá nhân là miễn phí để hỗ trợ các chữ ký bổ sung cho main nhưng phải ghi lại các chữ ký bổ sung đó. Nếu tài liệu trình biên dịch của bạn không liệt kê void main() làm chữ ký hợp pháp, thì bạn không nên sử dụng nó.

3) Theo quy ước (ít nhất là trên hệ thống * nix trong đó C được sử dụng lần đầu), trạng thái 0 cho biết thành công và trạng thái khác 0 cho biết ... một thứ khác ngoài thành công. Chính xác giá trị nào tương ứng với trạng thái nào tùy thuộc vào việc triển khai.

0

Chức năng không nhất thiết phải được khai báo trước tiên làm mẫu thử nghiệm. Tuyên bố như vậy là cần thiết chỉ khi chúng ta cần sử dụng một hàm trước khi nó được xác định.

chính có loại int theo định nghĩa.

Ý nghĩa của giá trị được trả lại từ chính là thông thường. Quy ước được chấp nhận chung là 0 được coi là thành công và không phải 0 loại thất bại nào đó.

0

1. Hàm main() được gọi ngầm bởi thư viện C bằng cách nhận diện từ khóa được tạo sẵn 'chính'. Vì vậy, chúng tôi không cần khai báo một mẫu thử nghiệm cho chức năng chính.

2.Điều này tôi không chắc chắn, nhưng tôi nghĩ nó phụ thuộc vào loại trình soạn thảo được sử dụng. Trong Turbo C, void main() sẽ được chấp nhận, trong khi trong dev-cpp main() sẽ trả về một giá trị.

3.quay trở lại 0 chỉ đơn giản là thoát khỏi chương trình với trạng thái thoát 0, nói cách khác giá trị trả lại xác định trạng thái thoát của chuỗi chính.

2

Bạn không được tự do chọn loại trả về của chính vì bạn không viết mã gọi chính. Mã gọi chính đã tồn tại trước khi bạn nghĩ về việc học C. Nó được viết bởi những người cung cấp mã khởi động thời gian chạy C, thường được liên kết tự động với tệp thực thi của bạn mà bạn không biết. Mã này thường nằm trong một tệp có tên là crt0.o (được tạo từ crt0.c hoặc thậm chí là assembler trong crt0.s). Nó hy vọng sẽ sử dụng một giá trị trả về cho biết thành công (0) hoặc thất bại (nonzero), cộng với các thông tin khác như mã bị chấm dứt do một tín hiệu và nếu có, cái nào. Đây là những bit của lịch sử Unix, rằng tôi sẽ không lặp lại ở đây :-)

0

Đơn giản chỉ cần đặt bản chất nhất cho tất cả các câu hỏi của bạn là truyền thống và sự phù hợp. dãy công cụ, hệ điều hành, vv biết đường mà rằng thủ tục này được gọi là main(), phải được gọi ra đầu tiên từ không gian mã người dùng (chương trình) ...

Bây giờ cụ thể: 1) Bởi vì sự phù hợp như tôi nói. Bạn không cần khai báo vì các thanh công cụ và hệ điều hành đã biết về chính. Ngoài ra còn có các hàm tương thích khác như exit().

2) Khi thời gian chính trả về thì hệ điều hành có thể có kết quả ngược lại. Thường không có nghĩa là lỗi. Vì vậy, khi U đang sử dụng tập lệnh hoặc các chương trình khác, hãy gọi chương trình của bạn, ví dụ: Hàm main(), bạn có thể kiểm tra xem nó có thành công hay không.

3) Trả lại lỗi khác có nghĩa là 0. Nhưng thực tế bạn có thể giải thích giá trị đó theo cách bạn muốn. Nhưng như tôi đã nói hệ điều hành có thể có kết quả.

Thông tin bổ sung: main() thực sự không phải là chức năng ĐẦU TIÊN (bạn đã viết) sẽ được gọi khi bạn bắt đầu chương trình. NHƯNG thực sự hệ điều hành và chuỗi công cụ tạo thuận lợi cho các cuộc gọi khác trước khi chính của bạn, để thiết lập môi trường, làm khởi hoặc bất cứ điều gì. Nhưng bạn không biết điều đó trực tiếp khi bạn viết mã của mình và bạn không phải đối phó với điều đó và nghĩ về điều đó chút nào. Trong các hệ thống nhúng, thường có một số hàm mức rất thấp được gọi để thiết lập đồng hồ chính CPU, ngắt, ngăn xếp, vv Một số chuỗi công cụ như IAR thực sự có thể cho phép bạn thực thi mã của riêng bạn trước khi gọi chính.

Hy vọng điều này giúp :)