c ++运行函数在声明之前?

时间:2012-01-04 19:06:17

标签: c++

我是CPP的新手,我想知道如何运行不在其范围内的函数。我习惯在javascript中做这些事情,当我尝试这样做时,我得到一个错误的CPP。我的意思是以下内容:

#include <iostream>

using namespace std;
int tic_h;
int tic_v;
void echo(string e_val){
   cout << e_val;
}
void c_mes(){
  echo("X|0|X\n");
  echo("-----\n");
  echo("X|0|X\n");
  echo("-----\n");
  echo("X|0|X\n");
  s_v();
}
void s_v(){
  echo("Please enter vertical coordinate: ");
  cin >> tic_v;
  if(tic_v<4&&tic_v>0){
    c_mes();
  }else{
    s_v();
  }
}
void s_h(){
  echo("Please enter horizontal coordinate: ");
  cin >> tic_h;
  if(tic_h<4&&tic_h>0){
    s_v();
  }else{
    s_h();
  }
}

int main(){
  s_h();
  return 0;
}

我收到此错误:

  

错误:第16行未在此范围内声明'sv'

我怎样才能让它发挥作用?

7 个答案:

答案 0 :(得分:7)

在使用该函数之前,您应该放置一个function prototype,以便编译器知道它将会是什么。

void s_v(); // prototype your functions, this is usually done in include files

#include行之后。

答案 1 :(得分:4)

您需要forward declare dostuff,如下例所示。

通过这样做你几乎告诉编译器该函数将被定义在其他地方,但是你想要使用它。

请原谅措辞,但是按照新手程序员的说法,按照我的方式进行操作非常全面。


#include <iostream>
using namespace std;

void dostuff (); // forward declaration

void test(int b){ 
    if(b<11&&b>0){
        cout << "Yay!";
    }   
    else{
        cout << "The number is not between 1 and 10.";
        dostuff();
    }   
}

void dostuff(){
    int numput;
    cout << "Please type a number between 1 and 10:";
    cin >> numput;
    test(numput);
}

int main(){
    dostuff();
}

OP刚刚编辑了他的问题中提供的原始片段(以下是修改版本),我将保留这篇文章,因为它很好地解释了这种情况。

答案 2 :(得分:2)

您需要在void s_v();功能之前添加c_mes()。这称为函数原型,它让编译器知道该符号存在,并将在稍后的代码中实现:

#include <iostream>
using namespace std;

int tic_h;
int tic_v;
void s_v();

void echo(string e_val) {
   cout << e_val;
}

void c_mes() {
    echo("X|0|X\n");
    echo("-----\n");
    echo("X|0|X\n");
    echo("-----\n");
    echo("X|0|X\n");
    s_v();
}

void s_v() {
    echo("Please enter vertical coordinate: ");
    cin >> tic_v;
    if (tic_v < 4 && tic_v > 0) {
        c_mes();
    } else {
        s_v();
    }
}

void s_h() {
    echo("Please enter horizontal coordinate: ");
    cin >> tic_h;
    if (tic_h < 4 && tic_h > 0) {
        s_v();
    } else {
        s_h();
    }
}

int main() {
  s_h();
  return 0;
}

请记住,如果您更改s_v()的签名(即添加参数或更改返回类型),您还需要更新原型。

答案 3 :(得分:1)

dostuff定义之前的某个位置声明void test,例如第3行:

void dostuff();

这样,您可以在定义函数之前向程序中引入dostuff函数的签名。

在C ++中,与javascript和其他一些语言不同,解析器找不到所有函数,然后编译代码。

答案 4 :(得分:0)

添加

void dostuff();

在using namespace std之后;它会起作用:))

答案 5 :(得分:0)

这是同样的错误,你在声明它之前使用一个函数(s_v()),为了解决你的错误你只应该创建一个s_v()的原型:

void s_v(); //at the start of your file

答案 6 :(得分:0)

写这个

void c_mes(){
  echo("X|0|X\n");
  echo("-----\n");
  echo("X|0|X\n");
  echo("-----\n");
  echo("X|0|X\n");
  s_v();
}

之后

void s_h(){
  echo("Please enter horizontal coordinate: ");
  cin >> tic_h;
  if(tic_h<4&&tic_h>0){
    s_v();
  }else{
    s_h();
  }
}