2016-09-12 4 views
-2

これがなぜ失敗するのか教えてください。C++ Beginner。関数を追加して呼び出しに失敗する

#include "stdafx.h" 
#include <string> 
#include <iostream> 
using namespace std; 
#include <conio.h> 

int main() 
{ 
    int a; 
    string abc = ""; 
    cout << "Enter your Name\n"; 
    cin >> abc; 
    cout << "Enter Your Age\n"; 
    cin >> a; 
    cout << "Hello " << abc << ", it is nice to meet you.\n"; 

    StartPause(); 

    return 0; 
} 

void StartPause() 
{ 
    cout << "\nPress any key to continue..." << endl; 
    _getch(); 
} 

重大度コード説明プロジェクトファイルの行抑制状態 エラーC3861 'StartPause':識別子が見つかりませんGreetingsConsoleApp \ BPM-fs103の\ユーザー... \ greetingsconsoleapp.cpp 20

を下図のように、私はエラーを取得しています
+0

言語に詳しいようになるまで*プリコンパイルされたヘッダー*を使用せず、コンパイラをプリコンパイルする必要があるまで、* –

+3

を 'main()'の前に移動することをお勧めします。 C/C++コンパイラは旅行に時間が掛かることはなく、後で定義することはできません。 –

答えて

3

コンパイラは、コンパイル単位、この場合は、あなたの.cppファイル、上から下へ順番に処理します。

あなたStartPause関数は、時間によって宣言されていないにも定義されてもされていないコンパイラは、それへの呼び出しを見つけたので、文句を言います。これは、宣言されていない変数を持つことに似ています。それを解決するために

、次のいずれか

  1. それがコンパイル単位
  2. の一番下にありますように main、または の定義は mainの定義を移動し
  3. 前に前方関数宣言を追加します。

つまり、

// includes and stuff... 

void StartPause(); // <-- forward declaration 

int main() { 
    // body definition 
} 

void StartPause() { 
    // body definition 
} 

またはこの:

// includes and stuff... 

void StartPause() { 
    // body definition 
} 

int main() { 
    // body definition 
} 

今コンパイラが呼び出しの試みが行われ、何をすべきか知っている前StartPauseが何であるかを知っているので、これら2のいずれかが問題を解決します。

4

このようmain前に機能StartPause()の宣言を追加します。

// Declares StartPause 
void StartPause(); 
int main() 
{ 
    ... 
} 

それとも上全体StartPause機能を移動0。コンパイラは.cppファイルを上から下にコンパイルするので、ここではコンパイラはStartPauseの使用を実際に宣言していないと見ています。

0

コンパイラは見下ろしことはありませんが、常にアップので、ダウンから呼び出されたものは、エラーが発生します。

#include <iostream>     // 1 

void Foo():       // 2 

int main()       // 3 
{         // 4 
    Foo();       // 5 

    return 0;      // 6 
}         // 7 

void Foo()       // 8 
{         // 9 
    std::cout << "Foo" << endl;  // 10 
}         // 11 

ここでわかるように、コンパイラは1行目から始まり、11行目で終了します。

Fooが呼び出された5行目に到達したときに定義を検索する(上向きに)検索され、実際にはこの関数の本体が後でこのどちらかに来ることを示す不完全な定義(関数プロトタイプ)ファイルまたはその他。あなたがプログラムをコンパイルするので、もし

今コンパイラが11(はFooの定義())を介してライン8を削除しても、関数の本体文句はありません!

***あなたがFooの定義なしでプログラムを実行しようとすると、 RUNTIME-ERRORが次のように不平を言ってくるでしょう:定義がない関数を呼び出す。

関連する問題