8

クラス を宣言する空のファイルがSimpletron.cppあります:Simpletron.hSimpletron

class Simpletron 
{    
public:
    Simpletron();
};

Simpletron()main.cpp を呼び出しました。

#include <iostream>
#include "Simpletron.h"

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

    Simpletron s();
    std::cin.get();
}

メイン関数は、警告やエラーなしでスムーズに実行されます。何故ですか?ヘッダーファイルがリンクできる実装がない場合、それはどのようにコンパイルされますか?

4

3 に答える 3

25

この行:

Simpletron s();

は関数プロトタイプであり、 という名前の関数を宣言し、sを返し、Simpletron引数を取らない。Simpletronという名前のインスタンスは作成されませんs

ここで、なぜリンカは存在しないs()関数について文句を言わないのでしょうか? 宣言するだけでs()実際に呼び出すことはないため、リンク中に実際にはどこにも参照されないため、リンク エラーは発生しません。

于 2013-09-24T00:38:36.903 に答える
5
    Simpletron s();

これは「煩わしい解析」の典型的なケースです。sコンパイラの場合、タイプの変数を作成するのではなく、Simpletronという名前の関数を宣言し、sパラメーターをとらず、オブジェクトを返しSimpletronます。

これは、この式が関数宣言と変数宣言の両方として解釈される可能性があるためです。変数を宣言するための簡単な代替手段 (つまり、括弧を省略するだけ) があるため、これを関数宣言として解釈することが標準で義務付けられています。

これは問題なくコンパイル フェーズを通過し (コンパイラはすべてのメソッドの定義Simpletronを持っている必要はなく、宣言だけを持っている必要はありません)、実際にはのインスタンスが作成されていないため、おそらくリンカはエラーを出さないため、実際にコンストラクター定義を探します (ただし、エラーが発生しないことが保証されているとは思いませんが、特に完全なコンパイラー/リンカーの組み合わせにより、不足しているコンストラクターに対してエラーが発生するはずです)。

于 2013-09-24T00:57:22.163 に答える