8

1994 年の難読化 C コンテストには、最小のクワインとして認定されたエントリがありました。それはただの空のファイルでした。

空のファイルをコンパイルできる C++ 仕様はありますか? そうでない場合、「有効なプログラム」の最低限の要件は何ですか? 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

少し甘やかすだけで、不足しているメインを回避できます。

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

アップデート:

main_empty.cpp冗長であることが指摘されました。コマンドから削除すると、同じようにコンパイルされます。

静的ジャンクをいくつか追加してmain_empty.cpp、別の動作で現れるかどうかを確認しました。ただし、実行可能サイズは変更されました。

#include <iostream>

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

ファイルにを追加し、main通常どおりコンパイルすると、通常の静的ロードで期待どおりに出力されます。

4

1 に答える 1

7

2012 年 11 月 2 日の C++ ドラフト。3.6.1:

プログラムには、プログラムの指定された開始である main と呼ばれるグローバル関数が含まれます。独立した環境のプログラムがメイン関数を定義する必要があるかどうかは、実装によって定義されます。[ 注: 独立した環境では、起動と終了は実装定義です。startup には、静的ストレージ期間を持つ名前空間スコープのオブジェクトのコンストラクターの実行が含まれます。終了には、静的ストレージ期間を持つオブジェクトのデストラクタの実行が含まれます。— エンドノート]

于 2013-07-07T20:06:03.603 に答える