什么是“未声明的标识符”错误,我该如何解决?
什么是未声明的标识符错误? 什么是常见原因,我如何解决这些问题?
示例错误文本:
- 对于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
的声明。 PrintHello
和printHello
是两个不同的名字,其中一个被声明,另一个没有被声明,但在主体
我有一个自定义的类,它是在一个命名空间中定义的问题。 我试图使用没有命名空间的类,导致编译器错误“标识符”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”