C++ を書くたびに、別のコードをメインに入れる必要があります。a1.cpp にはメインがあり、a2.cpp には a1.cpp のように別のメインがあります。
int main() {
printf("a1");
}
そしてa2.cppで
int main() {
printf("a2");
}
a1.cpp を実行すると出力が得られa1
、 を実行するa2
と string が得られますa2
。どうすればよいですか?
専門性: C++ プログラムには必要な数の関数を含めることができますが、グローバル名前空間main
に extern リンケージを持つ関数は 1 つだけです。
C++ プログラムで複数のエントリ ポイントが必要な場合、おそらく最も簡単な方法は、コマンド ライン引数を使用main
し、引数に基づいて他のスタートアップ関数へのプライマリ ディスパッチを行うことです。
1 つの代替方法は、必要なスタートアップ関数ごとに 1 つずつ、複数の実行可能ファイルをビルドすることです。その起動関数を持つオブジェクトコードファイルとリンクすることで、起動関数を選択することができます。main
または、プリプロセッサ ディレクティブを使用して、ビルドごとに関連する定義のみを条件付きで含めることができます。
ただし、システム固有の別の方法は、複数のエクスポートされた関数を使用して Windows DLL を作成することです。rundll32.exe
このような 32 ビット DLL は、標準の Windows プログラムを介して実行できます。
オブジェクトファイルを一緒にリンクしない限り有効です。そのままでは、ファイルa1.cpp
、a2.cpp
、a42.cpp
はまったく無関係です。それらを個別の実行可能ファイルにコンパイルし、個別に実行することができます。
これの重要な側面は、「実行」しないことですa1.cpp
。処理後にコンパイラの出力を「実行」しますa1.cpp
。
C++ では、main
プログラムのエントリ ポイントはグローバル スコープにあり、Java ではクラスにラップされます。main
したがって、複数の定義があるため、1 つのプログラムに複数の を含めることはできません。これに相当する Java は、同じクラス (同じ名前) の複数の定義を持つことになりますが、これも違法です。
主な違いは、Java バイトコードは OS 上で実行される JVM で実行されるのに対し、C++ プログラムは OS 上で直接実行されるため、基本的には、OS 上で実行しているときにアプリケーションのエントリ ポイントを JVM に伝えることができることです。エントリポイントは、メモリの場所によって事前に定義されているため (少なくとも私が知っていることから、間違っている場合は誰かが私を修正してください)、変更することはできません。BASH スクリプト (*NIX の場合) または Windows 上の *.bat ファイルを簡単に作成できますが、ファイル名を入力として受け取り、コンパイルしてから実行します。bash では次のようになります。
build.sh:
#!/bin/bash
gcc $1 -o prog.out && ./prog.out && rm prog.out
.
./build.sh a1.cpp
./build.sh a2.cpp