什么是“未声明的标识符”错误,如何解决?

时间:2014-03-05 11:55:54

标签: c++ compiler-errors declaration undeclared-identifier

什么是未声明的标识符错误?什么是常见原因以及如何解决它们?

示例错误文本:

  • 对于Visual Studio编译器:error C2065: 'cout' : undeclared identifier
  • 对于GCC编译器:'cout' undeclared (first use in this function)

13 个答案:

答案 0 :(得分:61)

它们通常来自忘记包含包含函数声明的头文件,例如,此程序将给出“未声明的标识符”错误:

缺少标题

int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

要修复它,我们必须包含标题:

#include <iostream>
int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

如果你编写了标题并正确包含它,标题可能包含错误的include guard

要了解详情,请参阅http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx

拼写错误的变量

当拼写错误变量时,会出现另一个常见的初学者错误来源:

int main() {
    int aComplicatedName;
    AComplicatedName = 1;  /* mind the uppercase A */
    return 0;
}

范围不正确

例如,此代码会出错,因为您需要使用std::string

#include <string>

int main() {
    std::string s1 = "Hello"; // Correct.
    string s2 = "world"; // WRONG - would give error.
}

声明前使用

void f() { g(); }
void g() { }

g在首次使用之前尚未声明。要解决此问题,请在g之前移动f的定义:

void g() { }
void f() { g(); }

或者在g之前添加f声明:

void g(); // declaration
void f() { g(); }
void g() { } // definition

stdafx.h不在顶部(VS特定)

这是特定于Visual Studio的。在VS中,您需要在任何代码之前添加#include "stdafx.h"。编译器会忽略它之前的代码,所以如果你有这个:

#include <iostream>
#include "stdafx.h"

#include <iostream>将被忽略。你需要将它移到下面:

#include "stdafx.h"
#include <iostream>

随意编辑此答案。

答案 1 :(得分:12)

在对话中考虑类似的情况。想象一下,你的朋友对你说,&#34;鲍勃正在过来吃饭,#34;你不知道鲍勃是谁。你会感到困惑,对吧?你的朋友应该说,&#34;我有一个名叫鲍勃的同事。鲍勃过来吃饭。&#34;现在鲍勃已经宣布,你知道你的朋友在说谁。

编译器发出未声明的标识符&#39;当您尝试使用某个标识符(函数,变量,类等的名称)时,错误并且编译器没有看到它的声明。也就是说,编译器不知道你指的是什么,因为它之前没有看过它。

如果你在C或C ++中遇到这样的错误,那就意味着你还没有告诉编译器你正在尝试使用的东西。通常在头文件中找到声明,因此可能意味着您没有包含相应的标头。当然,您可能根本没有想过要申报该实体。

根据上下文,某些编译器会提供更具体的错误。例如,尝试编译X x;,其中类型X尚未使用clang声明,将告诉您&#34;未知类型名称X&#34;。这更有用,因为您知道它试图将X解释为一种类型。但是,如果您有int x = y;,其中y尚未声明,则会告诉您&#34;使用未声明的标识符y&#34;因为y可能代表的内容存在一些模糊性。

答案 2 :(得分:5)

我在自定义类中遇到了同样的问题,该类是在命名空间中定义的。我试图使用没有命名空间的类,导致编译器错误“identifier”MyClass“is undefined”。 添加

using namespace <MyNamespace>

或使用类似

的类
MyNamespace::MyClass myClass;

解决了这个问题。

答案 3 :(得分:4)

在C和C ++中,所有名称必须在使用前声明。如果您尝试使用变量的名称或尚未声明的函数,您将收到“未声明的标识符”错误。

但是,函数是C中的特殊情况(仅在C中),因为您不必先声明它们。 C编译器将假设该函数与调用中的参数的数量和类型一起存在。如果实际的函数定义与之不匹配,则会出现另一个错误。 C ++中不存在函数的这种特殊情况。

通过确保在使用函数和变量之前声明它们来修复这些错误。对于printf,您需要在C ++中包含头文件<stdio.h>(或<cstdio>)。

对于标准功能,我建议您检查,例如this reference site,并搜索您要使用的功能。每个函数的文档都会告诉您需要哪个头文件。

答案 4 :(得分:3)

这些错误消息

1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)

表示您使用名称printf,但编译器没有看到声明名称的位置,因此不知道它的含义。

程序中使用的任何名称都应在使用前声明。编译器必须知道名称的含义。

在这种特殊情况下,编译器不会看到名称printf的声明。正如我们所知道的(但不是编译器),它是在C中的头<stdio.h>或C ++中的头<cstdio>中声明的标准C函数的名称,并放置在标准(std::)和全局中(::)(不一定)命名空格。

因此,在使用此函数之前,我们必须通过包含相应的头文件向编译器提供其名称声明。

例如 的 C:

#include <stdio.h>

int main( void )
{
   printf( "Hello World\n" );
}

<强> C ++:

#include <cstdio>

int main()
{
   std::printf( "Hello World\n" );
   // or printf( "Hello World\n" );
   // or ::printf( "Hello World\n" );
}

有时这种错误的原因是一个简单的错字。例如,假设您定义了函数PrintHello

void PrintHello()
{
    std::printf( "Hello World\n" );
}

但是在主要内容中您输了一个拼写错误而不是PrintHello,而是使用小写字母“p”键入printHello

#include <cstdio>

void PrintHello()
{
    std::printf( "Hello World\n" );
}

int main()
{
   printHello();
}

在这种情况下,编译器会发出这样的错误,因为它没有看到名称printHello的声明。 PrintHelloprintHello是两个不同的名称,其中一个已声明,其他未声明但在主体中使用

答案 5 :(得分:1)

另一种可能的情况:访问模板类中的父(模板类)成员。

修复方法:使用父类成员的全名(在成员名称前加上s1->s1.contains(s)this->)。

请参阅:templates: parent class member variables not visible in inherited class

答案 6 :(得分:1)

当我在Visual Studio项目中的自动格式化程序对我的包含进行排序时,发生了我的事情,此后,预编译的标头不再是第一个包含。

换句话说。如果您有以下任何一项:

#include "pch.h"

#include <stdio.h>

#include <iostream>
#include "stdafx.h"

将其放在文件的开头。

如果您的 clang格式程序正在自动对文件进行排序,请尝试在预编译的标头后放置一个enter。如果位于 IBS_Preserve 上,它将对每个#include块分别进行排序。

#include "pch.h"  // must be first

#include "bar.h"  // next block
#include "baz.h"
#include "foo.h"

更多信息,请访问 Compiler Error C2065

答案 7 :(得分:0)

就像使用函数而不声明它一样。头文件将包含 function printf()。在程序中包含头文件,这是解决方案。 在使用之前未声明时,某些用户定义的函数也可能通过错误。如果 它全球使用没有probs。

答案 8 :(得分:0)

c错误中的每个未声明的变量都是因为编译器无法在项目中找到它。可以包括定义变量的库的外部(头部)文件。因此,在您的问题中,您需要<stdio.h>,这是一个标准的输入输出文件,它描述了printf()的功能。

根据documentation,fprintf()的声明是在你使用函数之前必须包含它。

答案 9 :(得分:0)

大多数时候,如果您确定已导入有关的库,Visual Studio将为您提供IntelliSense的指导。

这对我有用:

确保首先声明#include "stdafx.h",即在所有包含的顶部。

答案 10 :(得分:0)

C ++标识符是用于标识变量,函数,类,模块或任何其他用户定义项的名称。在C ++中,必须先声明所有名称,然后才能使用它们。如果您尝试使用尚未声明的这样的名称,则会出现“未声明的标识符”编译错误。

根据documentation,printf()的声明位于cstdio中,即,在使用该函数之前,您必须包括它。

答案 11 :(得分:0)

可能还会出现此问题的另一种情况,

if(a==b)
double c;
getValue(c);

此处,该值在条件中声明,然后在条件外使用。

答案 12 :(得分:-1)

检查您是否在.m和.h中导入相同的软件包 给出的示例:我遇到了init方法的这个问题,它是由于缺少&#34; #import&#34;在.m文件