1

以下のコードは機能しません。

#include<iostream>
class Application
{
public:
    static int main(int argc, char** argv)
    {
        std::cin.get();
    }
};

静的メンバー関数は通常の関数とまったく同じであり、静的WinMainは正常に機能すると思いました。なぜ静的メインが機能しないのですか?

さて、私はある程度理解し始めたと思います、すべての答えに感謝します。

4

5 に答える 5

6

標準がそう言っているという理由だけで(3.6.1):

プログラムには、 と呼ばれるグローバル関数が含まれmainます。[...] 関数はオーバーロードされません。

あなたが持っているのは有効な機能ですが、それはプログラムのエントリポイントではありません。

于 2012-04-14T16:14:55.713 に答える
1

これは、コンパイルされるプログラムのリンク方法によるものです。main基本的にスコープの関係で見つかりません。

C ++標準では、「3.6-開始と終了[basic.start]」、特に「3.6.1-メイン関数[basic.start.main]」で​​静的メインを使用できない理由が詳しく説明されています。それが言うところ

すべての実装では、次のmainの定義の両方を許可する必要があります。

    int main() { /* ... */ }

    int main(int argc, char* argv[]) { /* ... */ }

標準のPDFはこちらです。PDFの69ページにあります。

そのようなコードを機能させたい場合は、次のようなことを行う必要があります。

class Application
{
public:
    static int main(int argc, char** argv)
    {
        std::cin.get();
    }
};

int main(int argc, char** argv)
{
    return Application::main(argc, argv);
}
于 2012-04-14T16:04:26.913 に答える
1

次のコードは問題なく動作します (ただし、頭の中で考えることができる利点はありません)。

#include<iostream>
class Application
{
public:
    static int main(int argc, char** argv)
    {
        std::cin.get();
        return 0;
    }
};

int main(int argc, char** argv)
{
    return Application::main(argc, argv);
}

mainまた、元の投稿の関数はメインではない ことに注意してください-その名前はグローバルとは完全に異なります-コンパイラは、メインと呼ばれる関数がクラスまたは名前空間内ではなくグローバルスコープに存在することを期待しています。Application::mainmain

于 2012-04-14T16:07:41.137 に答える
0

コードでは、静的メンバーmain()はクラスのスコープ内に存在しますが、それがプログラムのエントリ ポイント (または開始) になることを期待しない限り、これは問題ありません。

標準では、グローバル名前空間でエントリ ポイント (つまり、standard ) を定義する必要があります。 main()だからあなたはこれを行うことができます:

int main(int argc, char** argv) //defined in the global namespace
{
    return Application::main(argc, argv);
}
于 2012-04-14T16:07:21.847 に答える
0

2 つのクラス と がApplication1ありApplication2、どちらも と呼ばれる public static 関数mainがあり、適切な署名があるとします。どちらを選ぶべきですか?それでは意味がありません。

C++ 標準では、free 関数 main(私の記憶が正しければ、argc/argv と引数なしの 2 つの可能なシグネチャを使用) をプログラムへのエントリ ポイントとして定義しています。実装は、独自のものを自由に追加できます (WinMain など)。したがって、基本的に、静的クラス関数は、標準のエントリ ポイントとして定義されていません。

もちろん、グローバルmain関数の引数を、選択した内部メイン関数に自由に転送できます。

于 2012-04-14T16:10:56.370 に答える