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

什么是未声明的标识符错误? 什么是常见原因,我如何解决这些问题?

示例错误文本:

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

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

缺less标题

 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 。

拼写错误的variables

当你拼错一个variables时,会出现另一个初学者错误的常见原因:

 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在第一次使用之前还没有被宣布。 要解决这个问题,可以在f之前移动g的定义:

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

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

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

随意编辑这个答案。

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

然而,函数在C中是一个特殊情况(仅在C中),因为您不必首先声明它们。 C编译器将假定该函数与调用中的参数的数量和types一样存在。 如果实际的函数定义不匹配,则会得到另一个错误。 C ++中不存在函数的这种特殊情况。

通过确保函数和variables在使用之前声明,可以修复这些types的错误。 在printf的情况下,你需要包含头文件<stdio.h> (或者C ++中的<cstdio> )。

对于标准function,我build议您检查例如这个参考站点 ,并search您想要使用的function。 每个函数的文档都会告诉你你需要什么头文件。

在谈话中考虑类似的情况。 想象一下,你的朋友对你说:“鲍勃正要过来吃饭,”你不知道鲍勃是谁。 你会困惑的,对吧? 你的朋友应该说:“我有一个叫鲍勃的同事,鲍勃正要过来吃饭。” 现在Bob已经宣布了,你知道你的朋友在说什么。

当你试图使用一些标识符(什么是函数,variables,类等等),编译器发出“未声明的标识符”错误,编译器没有看到它的声明。 也就是说,编译器不知道你指的是什么,因为它以前没有见过。

如果在C或C ++中出现这样的错误,这意味着你没有告诉编译器你正在尝试使用的东西。 声明通常在头文件中find,所以可能意味着你没有包含适当的头文件。 当然,也可能是你根本不记得宣布实体。

一些编译器根据上下文给出更具体的错误。 例如,试图编译X x; 如果typesX没有用clang声明,会告诉你“unknown type name X ”。 这是非常有用的,因为你知道它试图把X解释为一种types。 但是,如果你有int x = y; ,其中y还没有被声明,它会告诉你“使用未声明的标识符y ”,因为对于y可能代表什么来说有一些含糊的含义。

这些错误消息

 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是两个不同的名字,其中一个被声明,另一个没有被声明,但在主体

我有一个自定义的类,它是在一个命名空间中定义的问题。 我试图使用没有命名空间的类,导致编译器错误“标识符”MyClass“未定义” 。 添加

 using namespace <MyNamespace> 

或者像使用类一样

 MyNamespace::MyClass myClass; 

解决问题。

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

c错误中的每个未声明的variables都是因为编译器无法在项目中find它。 可以包含定义variables的库的外部(头文件)文件。 因此在你的问题中,你需要<stdio.h> ,这是一个标准的input输出文件,它描述了printf()的function。

检查你是否导入相同的软件包在你的.m和你的.h例子给出:我有这个init方法的问题,这是由于缺less.m文件上的“#import”