错误:'settings'在此作用域中未声明

3
首先,这是我第一次编写代码,所以我是新手。
我正在使用devkit pro为nds编写代码,所以所有代码都是用c++编写的。我想要一个菜单,每个菜单屏幕都是void类型,并且我需要有一种方法返回到上一个菜单。
此外,我确保实际代码中没有语法错误(除非在此范围内未声明被视为语法错误)。
如何避免出现“Error 'settings' was not declared in this scope”错误? 代码:
    //Headers go here

    void controls()
    {
                                 //Inits and what not go here
            if (key_press & key_down) 

    /*This is generally how you say if the down key has been pressed (This syntax might be wrong, but ignore that part)*/
            {
            settings(); //This part doesn't work because it can't read back in the code
            }

    }
    void settings()
    {
                                 //Inits and what not go here
            if (key_press & key_down) 
            {
            controls();
            }

    }
    void mainMenu()
    {
                 //Inits and what not go here
            if (key_press & key_down) 
            {
                    settings();
            }
    }

AND NOTE,这段代码之外的某个地方将激活mainMenu()。那么,有谁知道如何正确编写此代码?
提前感谢。
5个回答

3

在您的函数调用时,编译器对该函数一无所知。有两种方法可以让编译器知道您的函数:声明定义

要声明该函数,您需要将函数的概述(函数参数和返回值)放置在编译模块的顶部,如下所示。

void settings(void);

要解决您的问题,您应该在第一次调用它之前声明 settings() 函数。
在您的情况下,您应该在文件顶部声明该函数。这样编译器就会了解该函数和应该传递的参数。
void settings();

void controls()
{
...
}
void settings()
{
...
}
void mainMenu()
{
...
}

这是一篇很好的文章,可以作为起点并获取一些额外信息:在 MSDN 上的声明和定义


我正试图解释这个问题,但你的解释更好,Mikhhail :) - OriginalCliche

1

快速解决方法是在controls()之前添加一个settings()的前向声明,如下所示:

void settings() ;

完整的代码:

//Headers go here

void settings() ;

void controls()
{
                             //Inits and what not go here
        if (key_press & key_down) 

/*This is generally how you say if the down key has been pressed (This syntax might be wrong, but ignore that part)*/
        {
        settings(); //This part doesn't work because it can't read back in the code
        }

}
void settings()
{
                             //Inits and what not go here
        if (key_press & key_down) 
        {
        controls();
        }

}
void mainMenu()
{
             //Inits and what not go here
        if (key_press & key_down) 
        {
                settings();
        }
}

请参考此前的讨论C++ - 前向声明


谢谢您快速的回复,太感谢了 :-) - Matthew D. Scholefield

0

settings() 是一个本地函数。它只能在其定义之后被调用。将定义移到 controls() 上方或通过头文件使其可用。


0
你是否在头文件中首先声明了settings()函数?此外,我没有看到你将任何方法限定在类名或命名空间中,如果这些方法是在头文件中声明的话,你可能会这样做。
如果你不需要头文件,无论出于什么原因,请改变你的编写顺序。在使用settings()函数之前定义它。

0
问题在于settings()在controls()之后声明,而controls()正在尝试调用settings()。然而,由于settings()还不存在,因此无法这样做。
您可以将settings()的定义移动到controls()之前,或者在controls()之前进行settings()的前向声明。
void settings(); //forward declaration
void controls() { 
  .....
}
void settings() {
  .... 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接