2011-01-10 26 views
12

Sau khi thử nghiệm trên msvc8, tôi thấy:Điều gì chạy trước chính()?

  1. Parse GetCommandLine() để argc và argv
  2. Chuẩn Thư viện C khởi
  3. C++ Constructor của biến toàn cục

Ba điều này được gọi là trước khi nhập chính().

Câu hỏi của tôi là:

  1. sẽ thực hiện lệnh này sẽ khác khi tôi porting chương trình của tôi để trình biên dịch khác nhau (gcc hoặc armcc), hay nền tảng khác nhau?
  2. Khởi tạo Thư viện Chuẩn C là gì? Cho đến nay tôi biết setlocale() là phải.
  3. Có an toàn khi gọi các hàm C chuẩn bên trong hàm dựng C++ của các biến toàn cầu?
+0

bạn đang cố gắng làm gì? initialzation thư viện cũng tạo ra một vài bộ đệm cho một số hàm (ví dụ: bộ đệm cho iostream). Có quá nhiều nhiệm vụ khác nhau để liệt kê. –

+0

Tại sao các đơn đặt hàng lại quan trọng? – SmallChess

+0

Điều gì sẽ chạy trước chính? Bất cứ điều gì nó theo đuổi. –

Trả lời

5

1: Thứ tự thực hiện này sẽ khác khi tôi chuyển chương trình sang trình biên dịch khác (gcc hoặc armcc) hoặc nền tảng khác?

Có.

2: Khởi tạo thư viện chuẩn C là gì? Cho đến nay tôi biết setlocale() là phải.

Tôi chắc chắn có những thứ khác. Bạn không nên dựa vào bất kỳ đối tượng toàn cục nào sau khi chính đã bắt đầu. Điều này có nghĩa là những thứ như luồng std (std :: cin, std :: cout) có thể không sử dụng được.

3: Có an toàn khi gọi hàm C chuẩn bên trong hàm dựng C++ của biến toàn cục không?

Có thể là không.

+1

@ephemient: Có thể an toàn. Nhưng có lẽ không phải là một ý kiến ​​hay. Các luồng này sử dụng miền địa phương một biến toàn cầu khác nhưng giá trị của nó có thể hoặc không thể là ngôn ngữ hiện tại hoặc "C". Thứ tự không xác định không phải là một vấn đề thực sự (nếu bạn biết nó tồn tại (Nó chỉ là một phiền toái mà có thể được làm việc xung quanh (nó là một vấn đề nếu bạn không biết nó tồn tại))). –

4

Đây là một số article từ nỗ lực của LSB (Linux Standard Base) mô tả những gì __libc_start_main có thể thực hiện trên Linux.

Cụ thể:

* performing any necessary security checks if the effective user 
    ID is not the same as the real user ID. 
* initialize the threading subsystem. 
* registering the rtld_fini to release resources when this dynamic 
    shared object exits (or is unloaded). 
* registering the fini handler to run at program exit. 
* calling the initializer function (*init)(). 
* calling main() with appropriate arguments. 
* calling exit() with the return value from main(). 

Và đây là một more detailed explanation.

Điều này hoàn toàn khác với Windows.

+0

Và điều đó thậm chí không đi vào thư viện thời gian chạy C++! – ephemient

+1

Là một người dùng C++ làm tôi đau đầu, không cần phải xem xét việc triển khai thư viện thời gian chạy C++ ... –

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