2016-09-12 3 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 \ уд-fs103 \ Users \ ... greetingsconsoleapp.cpp 20

+0

Я рекомендую не использовать * предварительно скомпилированные заголовки *, пока вы не освоитесь с языком * и не захотите, чтобы компиляторы были предварительно скомпилированы. * –

+3

переместите определение функции до 'main()'. Компиляторы C/C++ не путешествуют во времени и не видят, что у вас есть определение позже. –

ответ

3

Компилятор обрабатывает блок компиляции, ваш файл .cpp в этом случае, последовательно сверху вниз.

Функция StartPause не была объявлена ​​или не определена к тому моменту, когда компилятор находит вызов, поэтому он жалуется. Это аналогично наличию необъявленной переменной.

Чтобы решить эту проблему, либо:

  1. Добавить вперед объявление функции перед тем определение main или
  2. Переместить определение из main так, что это в нижней части модуля компиляции

Иными словами, либо это:

// 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 находится перед попыткой вызова сделана и будет знать, что делать.

4

Добавить объявление функции StartPause() перед тем, как это main:

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

Или переместить всю StartPause функцию выше main. Компиляторы компилируют файлы .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, а не наоборот.

Когда он достигает строки 5, где вызывается Foo, он ищет позади (вверх) поиск определения и фактически находит неполное определение (прототип функции), говорящий ему, что тело этой функции приходит позже либо в этом файл или в другом.

теперь компилятор не жалуется на тело функции, поэтому, если вы скомпилируете свою программу EVEN IF, удалите строки с 8 по 11 (определение Foo()) !!

*** Если вы попытаетесь запустить свою программу без определения Foo, вы получите RUNTIME-ERROR, жалующийся на вызов функции, определение которой отсутствует.

Смежные вопросы