sas*_*alm 46 c++ compiler-errors declaration undeclared-identifier
什么是未声明的标识符错误?什么是常见原因以及如何解决它们?
示例错误文本:
error C2065: 'cout' : undeclared identifier'cout' undeclared (first use in this function)sas*_*alm 64
它们通常来自忘记包含包含函数声明的头文件,例如,此程序将给出"未声明的标识符"错误:
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要修复它,我们必须包含标题:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您编写了标题并正确包含它,标题可能包含错误的包含保护.
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.
当拼错变量时,会出现另一个常见的初学者错误:
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,此代码会出错,因为您需要使用std::string:
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
Run Code Online (Sandbox Code Playgroud)
void f() { g(); }
void g() { }
Run Code Online (Sandbox Code Playgroud)
g在首次使用之前尚未申报.要修复它,要么移动g之前的定义f:
void g() { }
void f() { g(); }
Run Code Online (Sandbox Code Playgroud)
或者在g之前添加声明f:
void g(); // declaration
void f() { g(); }
void g() { } // definition
Run Code Online (Sandbox Code Playgroud)
这是特定于Visual Studio的.在VS中,您需要#include "stdafx.h"在任何代码之前添加.编译器忽略它之前的代码,所以如果你有这个:
#include <iostream>
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)
在#include <iostream>将被忽略.你需要将它移到下面:
#include "stdafx.h"
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
随意编辑这个答案.
Jos*_*eld 12
在对话中考虑类似的情况.想象一下,你的朋友对你说,"鲍勃正在过来吃饭,"你不知道鲍勃是谁.你会感到困惑,对吧?你的朋友应该说,"我有一个名叫鲍勃的同事.鲍勃正在过来吃饭." 现在鲍勃已经宣布,你知道你的朋友在谈论谁.
当您尝试使用某个标识符(函数,变量,类等的名称)时,编译器会发出"未声明的标识符"错误,并且编译器没有看到它的声明.也就是说,编译器不知道你指的是什么,因为它之前没有见过它.
如果在C或C++中出现这样的错误,则表示您没有告诉编译器您正在尝试使用的东西.声明通常位于头文件中,因此可能意味着您没有包含相应的标头.当然,可能你根本就没有记住要申报该实体.
一些编译器根据上下文给出更具体的错误.例如,尝试编译尚未使用clang声明X x;类型的位置X将告诉您"未知类型名称X".这更有用,因为你知道它试图将其解释X为一种类型.但是,如果你有int x = y;,在y尚未声明的地方,它将告诉你"使用未声明的标识符y",因为对于确切y代表什么可能有些含糊不清.
在 C 和 C++ 中,所有名称都必须在使用之前声明。如果您尝试使用尚未声明的变量或函数的名称,您将收到“未声明的标识符”错误。
但是,函数在 C 中(并且仅在 C 中)是一种特殊情况,因为您不必先声明它们。C 编译器将假定函数存在,其参数的数量和类型与调用中的一样。如果实际函数定义不匹配,您将收到另一个错误。C++ 中不存在函数的这种特殊情况。
您可以通过确保在使用函数和变量之前声明它们来修复这些类型的错误。如果printf您需要包含头文件<stdio.h>(或<cstdio>在 C++ 中)。
对于标准功能,我建议您检查例如这个参考站点,并搜索您想要使用的功能。每个函数的文档都会告诉您需要什么头文件。
小智 5
我在自定义类中遇到了同样的问题,该类是在命名空间中定义的.我试图使用没有命名空间的类,导致编译器错误"标识符"MyClass"未定义".添加
using namespace <MyNamespace>
Run Code Online (Sandbox Code Playgroud)
或者使用类似的
MyNamespace::MyClass myClass;
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
| 归档时间: |
|
| 查看次数: |
284862 次 |
| 最近记录: |