什么是未声明的标识符错误?什么是常见原因以及如何解决它们?
示例错误文本:
error C2065: 'cout' : undeclared identifier
'cout' undeclared (first use in this function)
答案 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
这是特定于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
的声明。 PrintHello
和printHello
是两个不同的名称,其中一个已声明,其他未声明但在主体中使用
答案 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文件