什么是未声明的标识符错误? 什么是常见的原因以及如何解决这些问题?
例如错误文本:
- 对于在Visual Studio编译器:
error C2065: 'cout' : undeclared identifier
- 对于GCC编译器:
'cout' undeclared (first use in this function)
什么是未声明的标识符错误? 什么是常见的原因以及如何解决这些问题?
例如错误文本:
error C2065: 'cout' : undeclared identifier
'cout' undeclared (first use in this function)
他们最经常来自忘记包括包含函数声明的头文件,例如,该程序会给出一个“未声明的标识符”的错误:
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
为了解决这个问题,我们必须包括头:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
如果你写的标题和正确包含它的头包含的错误包括后卫 。
要了解更多信息,请参阅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>
随意编辑这个答案。
考虑在谈话中有类似的情况。 试想一下,你的朋友对你说,“鲍勃过来吃饭,”你不知道谁是鲍勃。 你会被迷惑,对吧? 你的朋友应该说,“我有一位同事叫鲍勃。鲍勃是过来吃饭了。” 现在,鲍勃已申报,你知道谁是你的朋友都在谈论。
编译器发出,当你试图使用一些标识符(这将是一个函数,变量,类等的名称)和编译器还没有看到它的声明的“未声明的标识符”的错误。 也就是说,编译器不知道你指的是因为它以前没有见过它。
如果你用C或C ++这样的错误,这意味着你还没有告诉你要使用的东西的编译器。 声明通常在头文件中,所以它可能意味着您还没有相应的头。 当然,这可能是因为你只是还没有想起在所有申报的实体。
一些编译器给根据上下文更具体的错误。 例如,试图编译X x;
其中类型X
尚未声明铿锵会告诉你“未知类型名称X
”。 这是更为有用,因为你知道它试图解释X
的类型。 但是,如果你有int x = y;
其中y
还没有被声明,它会告诉你“使用未声明的标识符的y
”因为有大约究竟有些含糊y
可能代表。
我有同样的问题与一个自定义的类,它是在一个命名空间中定义。 我试图用类没有命名空间,从而使编译器错误“标识符‘MyClass的’不确定”。 添加
using namespace <MyNamespace>
或使用类等
MyNamespace::MyClass myClass;
解决了这个问题。
在C和C ++的所有名称必须在使用之前需要申报。 如果您尝试使用一个变量的名称或尚未声明,你会得到一个“未声明的标识符”错误的功能。
然而,功能是在C特殊情况(在只有C)中,你不必首先声明它们。 C编译器将假设函数的数量和参数类型如在呼叫存在。 如果实际的函数定义不匹配,你会得到另一个错误。 对于功能这种特殊情况下不会在C ++中存在。
您可以通过确保函数和变量在使用之前声明它们解决这些样的错误。 在的情况下printf
需要包含头文件<stdio.h>
(或<cstdio>
在C ++)。
对于标准的功能,我建议你检查如该参考网站 ,并搜索您想要使用的功能。 每个函数的文档会告诉你所需要的头文件。
这些错误meassages
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
键入printHello
用小写字母“P”。
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
在这种情况下,编译器会发出这样的错误,因为它没有看到名字的声明printHello
。 PrintHello
和printHello
是两个不同的名字,其中一个被宣布和其他未声明,但在主体中使用
另一种可能的情况:访问父在模板类(模板类)构件。
修正方法:使用由它的全名父类构件(由前缀this->
或parentClassName::
到成员的名称)。
参见: 模板:父类的成员变量在继承的类不可见
它就像使用功能未声明的。 头文件将包含函数printf()。 包含头文件在你的程序,这是该解决方案。 一些用户自定义函数也可以通过错误时不使用它之前宣布。 如果全球范围内使用没有probs。
大多数时候,如果你很确定你输入库中的问题,Visual Studio将引导你用智能感知。
这里是我工作:
确保#include "stdafx.h"
先声明,即在所有的包括顶部。
A C ++标识符是用于标识变量,函数,类,模块,或任何其它用户定义的项目的名称。 在C ++中的所有名字都在使用之前需要申报。 如果您尝试使用这样一个还没有被宣布,你会得到一个“未声明的标识符”的名称编译错误。
根据该文件 ,的printf()的声明是在cstdio即你必须包括它,使用该功能之前。
在C错误的每个未声明的变量来,因为编译器无法发现它在该项目。 一个可以包括在其中变量定义库的外部(头)文件。 因此,在你的问题,你需要<stdio.h>
,这是一个标准的输入输出文件,它描述的printf()功能。
根据该文件 ,fprintf中的()的声明是在IE中,你必须包括它,使用该功能之前。
检查是否导入在您的m,并在您的.h实例给出相同的程序包:我有这个非常有问题的init方法,它是由在.m文件缺少“#进口”造成