什么是未声明标识符错误?常见原因是什么,如何解决?
示例错误文本:
- 对于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;
}
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(); }
或者在 f
之前添加 g
的声明:
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>
随意编辑此答案。
X x;
,其中类型X
尚未声明,将告诉您“未知类型名称X
”。这更有用,因为您知道它正在尝试解释X
为类型。但是,如果您有int x = y;
,其中y
尚未声明,则会告诉您“使用未声明的标识符y
”,因为对于y
可能代表的确切内容存在某种模棱两可的情况。在C和C++中,所有变量名和函数名都必须在使用前进行声明。如果你试图使用一个未声明的变量或函数名称,你将会收到一个"未声明的标识符"错误。
不过,在C语言(仅限于C语言)中,函数是一种特殊情况,你不必先声明它们。C编译器会假定调用中函数已经存在,并且参数的数量和类型与调用相同。如果实际的函数定义与此不匹配,则会出现另一个错误。这种函数的特殊情况在C++中不存在。
为了解决这些错误,你需要确保在使用之前已经声明了变量和函数。对于printf
,你需要包含头文件<stdio.h>
(或C++中的<cstdio>
)。
对于标准函数,我建议你查阅例如这个参考网站,并搜索你想要使用的函数。每个函数的文档都会告诉你需要哪个头文件。
using namespace <MyNamespace>
MyNamespace::MyClass myClass;
这些错误信息
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
<stdio.h>
中,在C++语言中声明在头文件<cstdio>
中,并位于标准(std ::
)和全局(::
)命名空间中(不一定)。因此,在使用此函数之前,我们必须通过包含相应的头文件向编译器提供其名称声明。#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" );
}
但是在主程序中,你犯了一个错别字,你打成了小写字母'p'的printHello
,而不是PrintHello
。
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
printHello
的声明。 PrintHello
和 printHello
是两个不同的名称,其中一个被声明了,另一个在main函数体内被使用但未被声明。std::
的版本不能保证能够正常工作。 - M.M当 Visual Studio 项目中的自动格式化程序排序后,预编译头文件不再是第一个 include 时,我遇到了这种情况。
换句话说,如果您有以下任何一种情况:
#include "pch.h"
或者
#include <stdio.h>
或者
#include <iostream>
#include "stdafx.h"
把它放在文件的开头。
如果您的clang格式化器正在自动排序文件,请尝试在预编译头之后换行。如果设置为IBS_Preserve,它将单独对每个#include块进行排序。
#include "pch.h" // must be first
#include "bar.h" // next block
#include "baz.h"
#include "foo.h"
更多信息请参见编译器错误 C2065
C++标识符是用于标识变量、函数、类、模块或任何其他用户定义的项目的名称。在C++中,所有名称都必须在使用之前声明。如果您尝试使用未声明的标识符名称,则会收到“未声明的标识符”编译错误。
根据文档,printf()
的声明位于cstdio
中,即在使用该函数之前必须先包含它。
另一个可能的情况:在模板类中访问父类(一个模板类)成员。
修复方法:通过完整名称使用父类成员(通过在成员名称前缀加上this->
或parentClassName::
)。
参见:templates: parent class member variables not visible in inherited class。
还有一种情况可能会出现这个问题,
if(a==b)
double c;
getValue(c);
这里,在条件语句中声明了一个值,然后在它之外使用。
#include "stdafx.h"
被首先声明,也就是在所有的包含项之前。
<iostream>
并尝试使用std::string
,而没有包含<string>
。可能值得一提。 - πάντα ῥεῖ