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++程序,

visual studio 2008 c++ 中怎样添加动态链接库?

Visual Studio 2008 C++ 语言支持?