函数调用时找不到标识符错误

问题描述 投票:0回答:5

我这里有一个程序,可以反转输入字符串的大小写。这是我的 .cpp 文件中的代码,我使用的是 Visual Studio C++ IDE。我不确定头文件中需要什么,或者我是否需要一个头文件才能完成这项工作。

我的函数调用 swapCase 出错。由于某种我不确定的原因,Main 没有看到 swapCase。

#include <cctype>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    char name[30];
    cout<<"Enter a name: ";
    cin.getline(name, 30);
    swapCase(name);
    cout<<"Changed case is: "<< name <<endl;
    _getch();
    return 0;
}

void swapCase (char* name)
{
    for(int i=0;name[i];i++)
    {
        if ( name[i] >= 'A' && name[i] <= 'Z' )
            name[i] += 32; //changing upper to lower
        else if( name[i] >= 'a' && name[i] <= 'z')
            name[i] -= 32; //changing lower to upper
    }
}

任何其他语法或语义提示都值得赞赏。

c++ compiler-errors
5个回答
108
投票

在 main 函数之前添加这一行:

void swapCase (char* name);

int main()
{
   ...
   swapCase(name);    // swapCase prototype should be known at this point
   ...
}

这称为前向声明:编译函数调用时编译器需要知道函数原型。


25
投票

与您可能习惯的其他语言不同,C++ 中的所有内容都必须先声明才能使用。编译器将从上到下读取源文件,因此当它调用

swapCase
时,它不知道它是什么,因此会出现错误。您可以在 main 之前使用如下行声明您的函数:

void swapCase(char *name);

或者您可以简单地将整个函数移到文件中的 main 之前。不要担心看似最重要的函数(main)位于文件底部。在 C 或 C++ 中这样做很常见。


10
投票

编译器在main()中遇到对swapCase的调用时,它不知道函数swapCase,所以会报错。您可以将 swapCase 的 definition 移动到 main 之上,或者 declare swap case 到 main 之上:

void swapCase(char* name);

此外,swapCase 中的 32 会让读者停下来思考。评论有帮助!在这种情况下,它会增加书写的清晰度

if ('A' <= name[i] && name[i] <= 'Z')
    name[i] += 'a' - 'A';
else if ('a' <= name[i] && name[i] <= 'z')
    name[i] += 'A' - 'a';

我的 if 测试中的构建是个人风格的问题。你的很好。最主要的是修改 name[i] 的方法——使用 'a' 与 'A' 的差异使得发生的事情更加明显,并且没有人会怀疑 '32' 是否真的正确。

祝学习顺利!


1
投票

你必须在主定义之前定义 void swapCase 。


0
投票

我在编译现有应用程序时遇到了类似的错误,我在其中添加了新功能......

错误 C3861:“FunctionName”:找不到标识符

  • 解决办法是在使用前添加方法签名
  • 我必须添加缺少的导入,这导致该类无法编译
  • 必须按正确的顺序添加缺失的导入
  • 无论在何处使用,都要仔细检查函数名称是否正确键入

简化示例

#include <Windows.h>
#include <iostream>

namespace Test
{

    int FunctionName();
    
    int main()
    {
        int i = FunctionName();
        // do tasks
        return i;
    }
    
    int FunctionName()
    {
        /* my implemented logic with win32 dependencies */
        return -1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.