2013-07-07 33 views
7

Có một mục nhập trong số 1994 Obfuscated C contest đủ điều kiện làm phần nhỏ nhất. Đó chỉ là một tập tin trống.Việc biên dịch một tệp rỗng có tuân thủ tiêu chuẩn C++ không?

Có điều gì trong thông số C++ cho phép biên dịch các tệp rỗng không? Nếu không, mức tối thiểu cho một "chương trình hợp lệ là gì?" Tôi mơ hồ nhớ đọc ở đâu đó rằng có một trường hợp đặc biệt mà một tập tin trống được đưa ra một thực hiện mặc định trong spec C++, nhưng tôi không thể tìm thấy tài liệu tham khảo.

Tôi đã thử điều này, mặc dù tôi không biết rằng nó nhất thiết phải thuyết phục.

$ rm main_empty.cpp 
rm: cannot remove `main_empty.cpp': No such file or directory 
$ touch main_empty.cpp 
$ g++ -o empty main_empty.cpp 
/usr/lib/gcc/.../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: error: ld returned 1 exit status 

Với một chút khó khăn, bạn có thể nhận được xung quanh phần còn thiếu.

$ g++ -Wl,--defsym=_start=_exit -Wl,--undefined=_exit \ 
    -nostartfiles -static -o empty main_empty.cpp 

UPDATE:

Nó được lưu ý rằng main_empty.cpp là không cần thiết. Nếu bạn loại bỏ nó khỏi lệnh nó biên dịch giống nhau.

Tôi đã thêm một số thư rác tĩnh vào main_empty.cpp để xem nó có được biểu hiện trong hành vi khác và không. Tuy nhiên, nó đã thay đổi kích thước thực thi.

#include <iostream> 

struct Foo { 
    Foo() { 
     std::cout << "hi" << std::endl; 
    } 
} foo; 

Nếu bạn thêm một main đến tập tin, và biên dịch như bình thường nó sẽ ra như bạn mong muốn với tải tĩnh điển hình.

+0

Cho đến khi C++ 11, tôi tin rằng tất cả những gì cần là một dòng mới. Vấn đề 'main' không liên quan gì đến việc biên dịch nó. – chris

+0

'main_empty.cpp' trong dòng cuối cùng của bạn là hoàn toàn dư thừa. –

+0

Khi bạn nhìn vào chuỗi công cụ tạo ra tệp thực thi mà bạn đã liên kết, bạn sẽ nhận thấy rằng 'cp smr.c smr' và' chmod + x smr' được áp dụng thay vì trình biên dịch C thực tế. – moooeeeep

Trả lời

7

Bản nháp C++ từ 2012-11-02. 3.6.1:

Chương trình phải chứa hàm toàn cầu được gọi là chính, là khởi đầu được chỉ định của chương trình. Nó được thực hiện xác định xem một chương trình trong một môi trường tự do là cần thiết để xác định một chức năng chính . [Lưu ý: Trong một môi trường tự do, khởi động và chấm dứt được thực hiện xác định; start- up chứa việc thực thi các hàm tạo cho các đối tượng của phạm vi không gian tên với thời gian lưu trữ tĩnh; chấm dứt chứa việc thực hiện các destructors cho các đối tượng có thời gian lưu trữ tĩnh. - lưu ý cuối cùng]

+1

Đó là loại thú vị như thế nào không có trình biên dịch sẽ không biên dịch đó, nó sẽ chỉ không liên kết. Nó giúp bạn nửa chừng ở đó. – chris

+6

@chris nó nói _program_ not _translation unit_. Trình liên kết là một phần của quá trình tạo ra một chương trình được định dạng tốt. – moooeeeep

+0

@moooeeeep, Good point :) – chris

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