2

2 つのオーバーロードされた関数があるとします。

fun1(int)
fun1()

この場合、#pragma startupディレクティブを使用してプログラムの実行を開始するにはどうすればよいfun1(int)ですか?

構文には関数名のみが含まれます。

#pragma startup fun1 100

これら 2 つの機能のどちらかを選択する方法はありますか?

アップデート:

コンパイラー - Turbo c/c++ 3.1 (古いコンパイラーで申し訳ありません)

4

4 に答える 4

3

これは Borland 固有のディレクティブであり、文書化もされています。main() 関数に入る前に実行する関数を指定できるようにするだけです。通常は、初期化関数に使用します。これは、 C および C++ の実装が被る悪名高い「静的初期化順序の大失敗」に対する小さな一時しのぎです。プログラムが大きくなると、優先番号を選択する必要があるため、出血が止まるかどうかはわかりません。

とにかく、 main() の代わりに使うべきものは何もありません。関数から戻って exit() を呼び出さない限り、機能させることができると思いますが。もちろん、引数を使用することはできません。CRT が渡すことができる意味のあるものは何もありません。したがって、オーバーロードも機能しません。main() に固執します。

于 2013-10-08T20:16:58.010 に答える
1

コンパイラに関するドキュメントを見つけることも、コンパイラ自体を使用して私の推測を確認することもできません。しかし、私が覚えていることから、#pragma startup引数なしで関数を取り、void を返します。

さらに、引数をとる関数だけを残すと、コードが機能しないと推測しますint

それを除けば、そのような方法で呼び出された関数に引数を渡すことはできないと思います。

解決策として、次のように、必要な引数を使用して任意の関数を呼び出して、ラッパー関数を作成することをお勧めします。

void start()
{
#pragma startup start
    fun1( global_var_name );
}
于 2013-10-08T18:35:27.813 に答える
1

制限を理解しているかどうかは正確にはわかりませんが、別の名前で別の関数を定義して、必要な関数に転送するのはどうですか?

void fun2() { fun1(42); }

#pragma startup fun2 100
于 2013-10-14T22:01:05.523 に答える