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.
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
'main_empty.cpp' trong dòng cuối cùng của bạn là hoàn toàn dư thừa. –
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