Các mainchức năng phải được khai báo là một hàm không thành viên trong không gian tên toàn cầu. Điều này có nghĩa là nó không thể là hàm thành viên tĩnh hoặc không tĩnh của một lớp, cũng không thể đặt nó trong một không gian tên (ngay cả không gian tên không tên).
Tên mainkhông được dành riêng trong C ++ ngoại trừ như một chức năng trong không gian tên toàn cầu. Bạn có thể tự do khai báo các thực thể khác có tên main, bao gồm trong số những thứ khác, các lớp, biến, liệt kê, hàm thành viên và các hàm không phải thành viên không có trong không gian tên toàn cục.
Bạn có thể khai báo một hàm có tên mainlà một hàm thành viên hoặc trong một không gian tên, nhưng một hàm như vậy sẽ không phải là mainhàm chỉ định nơi chương trình bắt đầu.
Các mainchức năng không thể được khai báo là statichay inline. Nó cũng không thể bị quá tải; chỉ có thể có một hàm được đặt tên maintrong không gian tên toàn cục.
Các mainchức năng không thể được sử dụng trong chương trình của bạn: bạn không được phép để gọi mainhàm từ bất cứ nơi nào trong mã của bạn, cũng không phải bạn được phép lấy địa chỉ của nó.
Các loại trả lại mainphải đượcint . Không có loại trả về nào khác được cho phép (quy tắc này được in đậm vì rất thường thấy các chương trình không chính xác khai báo mainvới loại trả về void; đây có thể là quy tắc bị vi phạm thường xuyên nhất liên quan đến mainchức năng).
Có hai tuyên bố mainđó phải được cho phép:
int main() // (1)
int main(int, char*[]) // (2)
Trong (1) , không có tham số.
Trong (2) , có hai tham số và chúng được đặt tên theo quy ước argcvà argv, tương ứng. argvlà một con trỏ tới một chuỗi các chuỗi C đại diện cho các đối số cho chương trình. argclà số lượng đối số trong argvmảng.
Thông thường, argv[0]chứa tên của chương trình, nhưng điều này không phải lúc nào cũng đúng. argv[argc]được đảm bảo là một con trỏ null.
Lưu ý rằng vì một đối số kiểu mảng (như char*[]) thực sự chỉ là một đối số kiểu con trỏ được ngụy trang, hai cách sau đây là cả hai cách hợp lệ để viết (2) và cả hai đều có nghĩa chính xác giống nhau:
int main(int argc, char* argv[])
int main(int argc, char** argv)
Một số triển khai có thể cho phép các loại và số lượng tham số khác; bạn phải kiểm tra tài liệu triển khai của mình để xem những gì nó hỗ trợ.
main()dự kiến sẽ trả về 0 để biểu thị thành công và khác không để biểu thị sự thất bại. Bạn không bắt buộc phải viết một returntuyên bố rõ ràng main(): nếu bạn main()trả lại mà không có một returntuyên bố rõ ràng , nó giống như khi bạn đã viết return 0;. Hai main()chức năng sau có cùng hành vi:
int main() { }
int main() { return 0; }
Có hai macro, EXIT_SUCCESSvà EXIT_FAILURE, được xác định trong <cstdlib>đó cũng có thể được trả về main()để biểu thị thành công và thất bại, tương ứng.
Giá trị được trả về main()được truyền cho exit()hàm, kết thúc chương trình.
Lưu ý rằng tất cả những điều này chỉ áp dụng khi biên dịch cho một môi trường được lưu trữ (không chính thức, một môi trường nơi bạn có một thư viện tiêu chuẩn đầy đủ và có một hệ điều hành chạy chương trình của bạn). Cũng có thể biên dịch chương trình C ++ cho môi trường tự do (ví dụ: một số loại hệ thống nhúng), trong đó trường hợp khởi động và chấm dứt được xác định hoàn toàn do triển khai và một main()chức năng thậm chí không được yêu cầu. Tuy nhiên, nếu bạn đang viết C ++ cho một hệ điều hành máy tính để bàn hiện đại, thì bạn đang biên dịch cho một môi trường được lưu trữ.
maintrả về trong C và C ++ .