C ++初学者。添加函数并调用它失败

时间:2016-09-12 20:52:39

标签: c++

你能帮助我,让我知道为什么会失败吗?我收到错误,如下所示:

#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 \ users ... \ greetingsconsoleapp.cpp 20

3 个答案:

答案 0 :(得分:4)

StartPause()之前添加函数main的声明,如下所示:

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

或将整个StartPause函数移到main之上。编译器从上到下编译.cpp文件,所以这里编译器已经看到StartPause的使用而没有真正看到它的声明。

答案 1 :(得分:3)

编译器在这种情况下按顺序从上到下处理编译单元/com/audit/client文件。

您的.cpp函数既未在编译器发现调用时被声明也未定义,因此它会抱怨。这类似于拥有一个未声明的变量。

要解决它,要么:

  1. StartPause的定义之前添加转发函数声明,或
  2. 移动main的定义,使其位于编译单元的底部
  3. 换句话说,要么:

    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 } 是什么,并且知道该怎么做。

答案 2 :(得分:0)

编译器永远不会向下看,但总是向上,所以从down调用的任何东西都会导致错误。

#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时,它会向后看(向上)搜索一个定义,实际上它找到一个不完整的定义(函数原型),告诉它该函数的主体后来要么在这个文件中或者在其他地方。

现在编译器没有抱怨函数体,所以如果你编译你的程序即使删除第8行到第11行(Foo()的定义)!!

***如果你试图在没有Foo定义的情况下运行你的程序,你会得到 一个RUNTIME-ERROR抱怨:调用一个缺少定义的函数。