確かに、これをヘッダー ファイルの 1 つ、たとえば preinit.h に入れます。
class Init { public: Init() { initialize(); } }; Init init;
次に、コンパイル単位の1 つに次のように入力します。
void initialize(void) {
// weave your magic here.
}
#include "preinit.h"
私はそれが不器用であることを知っていますが、ファイルスコープで実行されるクラスコンストラクターを使用せずにプリメイン初期化を行う移植可能な方法を知りません。
また、C++ が順序を決定するとは思わないため、これらの初期化関数を複数含めることにも注意する必要があります。順序はランダムである可能性があります。
あなたが話しているこの「スケッチ」についてはわかりませんが、コンパイラに渡す前にスクリプトを使用してメインのコンパイルユニットを変換することは可能でしょうか?
awk '{print;if (substr($0,0,11) == "int main (") {print "initialize();"};}'
次の理由により、これがプログラムにどのように影響するかを確認できます。
echo '#include <stdio.h>
int main (void) {
int x = 1;
return 0;
}' | awk '{
print;
if (substr($0,0,11) == "int main (") {
print " initialize();"
}
}'
initialize()
追加された呼び出しで以下を生成します。
#include <stdio.h>
int main (void) {
initialize();
int x = 1;
return 0;
}
生成されたファイルを後処理できない可能性があります。その場合、その最後のオプションを無視する必要がありますが、それは私が最初に見ているものです。