2013-03-11 37 views
5

Là một newbie đến C++, đến từ python, tôi không chắc tại sao C++ không cho phép mã bên ngoài một hàm (trong không gian tên chung?). Có vẻ như điều này có thể hữu ích khi thực hiện một số khởi tạo trước khi hàm main() được gọi hoặc các hàm khác thậm chí được khai báo. (Tôi không cố gắng tranh luận với trình biên dịch, tôi chỉ muốn biết quy trình suy nghĩ đằng sau việc thực hiện nó theo cách này.)Tại sao mã C++ phải được chứa trong các hàm?

+0

Trong trường hợp không có chức năng, mã như thế sẽ được thực thi như thế nào? –

+0

Vẫn còn nhiều cách để thực thi mã trước 'main' không liên quan đến mã toàn cầu lộn xộn. – chris

+1

Dường như tất cả đều không hữu ích. –

Trả lời

12

Khi bạn đang chạy chương trình python, trình thông dịch sẽ chạy từ đầu đến thực thi dưới cùng khi nó hoạt động. Trong C++, điều đó không xảy ra. Trình biên dịch xây dựng tất cả các chức năng của bạn thành các đốm nhỏ của mã máy và sau đó trình liên kết móc chúng lên. Khi chạy, hệ điều hành gọi hàm main của bạn và mọi thứ diễn ra từ đó. Trong bối cảnh đó, mã bên ngoài các hàm là vô nghĩa - khi nào nó sẽ chạy?

+0

Câu trả lời này đã giúp rất nhiều với một ý tưởng quan trọng mà tôi muốn phần nào trau chuốt trong việc học C++ của tôi; cụ thể là nó là một ngôn ngữ được biên dịch. –

+0

Tôi giả định đây cũng là trường hợp của C? –

+0

Có, nó giống nhau đối với C. –

1

Điểm chính() là điểm truy cập vào chương trình. Vì vậy, bất kỳ mã nào bạn muốn viết sẽ cần phải có thứ tự thực hiện từ thời điểm đó.

Biến tĩnh được khởi tạo trước khi hàm main() được thực hiện, vì vậy bạn có thể bắt đầu bất kỳ biến nào bạn cần trước đó.

Nhưng nếu bạn muốn chạy mã khởi tạo trạng thái của chương trình, bạn nên thực hiện nó ngay từ đầu chương trình và lạm dụng các biến tĩnh và thực hiện một số hàm tạo.

3

Điều này có thể được coi là sự khác biệt về phong cách giữa C++ và Python. Tuy nhiên, cũng có những lý do khá tốt cho nó. Trong C và C++, có một nơi rất rõ ràng và cụ thể rằng việc thực thi mã của bạn bắt đầu từ, và đó là sự khởi đầu của hàm main() (tất nhiên, đây chỉ là sự gần đúng của sự thật, nhưng chúng ta có thể bỏ qua điều đó bây giờ .) Trên thực tế, một chương trình C/C++ bắt đầu và kết thúc với hàm main() - theo ý kiến ​​của tôi - giúp khá nhiều khi bạn muốn hiểu một chương trình thực sự làm gì. Dòng chảy cao cấp của chương trình là rõ ràng hơn. Ngược lại điều này với sự thay thế; với mã phân tán tất cả thông qua các tập tin và ở giữa các chức năng và whatnot.

Ngay cả trong một chương trình Python được tổ chức tốt và không tầm thường, bạn đặt mã chính của mình dưới if __name__ == "__main__":, đúng không?

Giờ đây, đối với một số nội dung nâng cao hơn một chút. Có nhiều cách để chạy mã trước khi hàm main() được gọi. Dưới đây là một trong số họ:

#include <iostream> 
using namespace std; 

bool RunBeforeMain() 
{ 
    cout << "Before main()!" << endl; 
    return true; 
} 

// This variable here causes the above function to be called 
bool ignore_this_variable = RunBeforeMain(); 

int main() 
{ 
    cout << "Start of main()" << endl; 
    return 0; 
} 

Ngoài ra, các nhà thầu của tất cả các biến toàn cầu và tất cả các static thành viên của lớp học và một số công cụ nền tảng phụ thuộc đang chạy trước khi main(). Tương tự, có nhiều cách để chạy mã sau khi main() hoàn tất. Đó thường là các destructors cho các đối tượng được xây dựng trước khi main() bắt đầu và các hàm được đăng ký với hàm atexit().

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