C++ Visual Studio 2008 中未声明的标识符
Posted
技术标签:
【中文标题】C++ Visual Studio 2008 中未声明的标识符【英文标题】:undeclared identifier in C++ Visual Studio 2008 【发布时间】:2011-10-14 22:04:52 【问题描述】:我在 Visual Studio 2008 中有一个 C++ 项目。
在项目中,我有几个表单和几个非表单类。一种特别称为 Import_LP.h 的非形式,它是一个具有多个方法的类,所有这些方法都写入头文件中,而资源文件中没有任何内容。
我对任何表单类中的#include Import_LP 以及创建对象和引用它的任何方法都没有问题,但是我尝试将它#include 到的任何其他类,它给了我一个
syntax error : undeclared identifier 'Import_LP'
在它被引用的行上出现,即 Import_LP^ importLP;
我来自 java/c# 背景,这里的链接有什么遗漏吗?
【问题讨论】:
【参考方案1】:如果你有包含守卫,它是这样的:预处理器包括 Import_LP.h,它说“只包括我一次”,然后包括 Window.h,它试图包括 Import_LP.h,但不是因为包括后卫。于是 Window.h 开始解析窗口类,但由于 Import_LP.h 类头尚未完全加载而失败。
解决方案是预先声明类:
窗口.h:
#ifndef WINDOW_H //works best if this is first
#define WINDOW_H
#pramga once
class Import_LP;
class Window
Import_LP* member; //member has to be a pointer
void func();
;
#include "Import_LP.h"
inline void Window::func()
#endif WINDOW_H
Import_LP.h:
#ifndef IMPORT_LP_H //works best if this is first
#define IMPORT_LP_H
#pramga once
class Window;
class Import_LP
void func(Window& parent); //parameter has to be a pointer or reference
;
#include "Window.h"
inline void Import_LP::func(Window* parent)
#endif IMPORT_LP_H
这将只允许您通过指针或引用来引用另一个,直到实际包含,但这应该是可行的。从技术上讲,您只需对一个或其他标题执行此操作。
【讨论】:
【参考方案2】:我能够偶然解决这个问题。
那么显然你不能让两个文件相互包含?
我在做
#include Window.h
在 Import_LP.h 中
和
#include Import_LP.h
在 Window.h 中。
如果有人能向我解释为什么你不能这样做,我将不胜感激。
【讨论】:
我在答案中对问题和解决方法进行了完整描述【参考方案3】:听起来 Import_LP 类型是未定义的,您的挑战是找出原因。首先要做的是阅读 import_LP.h 的内容并弄清楚 Import_LP 是如何声明的。一种可能的方法是打开一个好的文件,右键单击 Import_LP 的使用并选择“Go To Declaration”。这应该将焦点转移到适用于特定情况的 Import_LP 声明。
可能是声明被#ifdef 包围,以某种方式阻止它在您的其他文件中编译。或者可能是其他原因,我们确实没有足够的细节来处理。
更新:
那么显然你不能让两个文件相互包含? . . . 如果有人能向我解释你为什么 不能这样做。
当您这样做时,您最终可能会多次定义类型和变量。
#include guard 和 #pragma once 等技术可用于缓解此类问题。
【讨论】:
感谢您的回复,我确实有#include Import_LP^,当我右键单击->在对象声明Import_LP^上找到声明时,它正确地指向了正确的类。我已经声明并包含了与其他好文件完全相同的方式。此外,这些文件中没有使用#ifdef。这是 Import_LP.h 开头的声明 #pragma once #ifndef IMPORT_LP_H #define IMPORT_LP_H 您没有#include "Import_LP.h" 吗?以上是关于C++ Visual Studio 2008 中未声明的标识符的主要内容,如果未能解决你的问题,请参考以下文章
C++:Visual Studio 2015 中未解析的外部符号 _sprintf 和 _sscanf
将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?
如何在visual studio2008中创建,编译和运行C++程序,