main()
面接で、C または C++ プログラムのエントリ ポイントを他の関数に変更するようにと質問されました。どうすればそれが可能でしょうか?
ベストアンサー1
標準 C (および、おそらく C++ も同様) では、少なくともホストされた環境では、これを行うことはできません (ただし、以下を参照してください)。標準では、C コードの開始点は であると指定されていますmain
。標準 (c99) では、議論の余地はあまりありません。
5.1.2.2.1 プログラムの起動: (1) プログラムの起動時に呼び出される関数の名前はmainです。
以上です。その後、パラメータと戻り値について少し説明しますが、名前を変更する余地はまったくありません。
これはホスト環境向けです。この標準では、フリースタンディング環境 (つまり、組み込みシステムなどでは OS なし) も許可されています。フリースタンディング環境の場合:
フリースタンディング環境(オペレーティング システムの恩恵を受けずに C プログラムが実行される環境)では、プログラムの起動時に呼び出される関数の名前と型は実装定義です。条項 4 で要求される最小限のセットを除き、フリースタンディング プログラムで使用できるライブラリ機能は、実装定義です。
C言語では「トリック」を使うことができる実装エントリ ポイントではないように見せることができますmain
。これは、実際に初期の Windows コンパイラがWinMain
開始点としてマークするために行ったことです。
最初の方法: リンカーは、 のようなファイルにいくつかの premain スタートアップ コードを含めることができます。start.o
このコードが実行されて C 環境が設定され、 が呼び出されますmain
。代わりに を呼び出すものに置き換えることを妨げるものは何もありませんbob
。
2 番目の方法: 一部のリンカーでは、コマンドライン スイッチでそのオプションが提供されており、起動コードを再コンパイルせずに変更できます。
3 番目の方法: 次のコードでリンクできます。
int main (int c, char *v[]) { return bob (c, v); }
そして、あなたのエントリーポイントはあなたのコードは、bob
むしろ のようですmain
。
しかし、これらすべては、おそらく学術的な興味の対象ではあるものの、私が何十年もコードを削減してきた中で、これが必要または望ましい状況を 1 つも思いつかないという事実は変わりません。
私は面接官にこう尋ねます。なぜあなたは欲しいこれをする?