使用不完整类型'DIR'无效

时间:2011-07-31 11:52:16

标签: c++ directory dir directory-listing

我正在尝试编译此代码,该代码在Windows上运行良好,在Linux(Code :: Blocks)上运行:

/* Edit: Includes */
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <...>
/**/

/* === */

/* Function code */
DIR *dp;
dirent *ep;
string name_parent;

dp = opendir(somepath);
name_parent = dp->dd_name; //error
/**/

由于Windows上的路径名不区分大小写,因此我可以读取“c://程序文件”之类的用户输入并获取“正确”路径“C:\ Program Files *”(星号除外 - 或者“F://” - &gt;“F:*”)。我还使用此变量来获取具有绝对路径值的目录列表,因为ep-&gt; d_name(当然在一些readdir()之后)返回相对于某路径的路径。

在Linux上,我收到编译错误(对于“dp-&gt; dd_name”):

  

错误:无效使用不完整类型'DIR'

我忘了什么吗? 或者是否存在逻辑错误?

修改:我已经添加了上面的包含(我已经在使用)。

6 个答案:

答案 0 :(得分:3)

/* Edit: Includes */
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <...>
/**/

/* === */

/* Function code */
DIR *dp;
dirent *ep;
string name_parent;

dp = opendir(somepath);
ep = readdir(dp);
name_parent = ep->d_name;

/**/

变量d_name存在于struct dirent中,它提供了目录的名称

答案 1 :(得分:2)

您没有声明DIR的类型!在Posix系统上,你会说,

#include <sys/types.h>
#include <dirent.h>

但是,在Windows上,您没有这些功能。相反,您可以使用Windows API filesystem functions

答案 2 :(得分:1)

是肯定的。你错过了包括头文件。

dirent.h

答案 3 :(得分:1)

DIR的内部结构未指定,因此您不应该依赖它并期望您的代码可移植。

Windows的glib源代码说明DIR

/*
 * This is an internal data structure. Good programmers will not use it
 * except as an argument to one of the functions below.

答案 4 :(得分:0)

显然,类型DIR未在您尝试使用它时定义。也许你忘记了#include

答案 5 :(得分:0)

现在我已经面对了这个问题,但并没有忘记它包含警告,所以不会忘记包括一些标头或定义。

我的files.h;

class Files
{
public:
    explicit Files(const char *p_path = 0);
    ~Files();

    /* ....  */
private:
    std::string path;
}

我的files.cpp;

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h> // I added this line with @Kerrek SB's advice but nothing changed
#include <dirent.h>
#include <files.h>

static DIR *p_dir = NULL;
static struct dirent *p_ent = NULL;
Files::Files(const char *p_path)
{
    if (p_path == NULL)
    {
        std::cerr << "PATH is NULL" << std::endl;
        exit(EXIT_FAILURE);
    }
    path = p_path;
    p_dir = opendir(p_path);
    if (p_dir == NULL)
    {
        std::cerr << "Cannot open " << path << std::endl;
        exit(EXIT_FAILURE);
    }
}

Files::~Files()
{
    if (p_dir)
    {
        /* Here is my warning occuring in this line and the definition
           line p_dir 'static DIR *p_dir = NULL' */
        delete p_dir; // After changing this line with 'free(p_dir);' warnings gone.
        p_dir = NULL;
    }
}

定义行(static DIR *p_dir = NULL;处的警告为'p_dir' has incomplete type,删除行(delete p_dir;)处的警告为possible problem detected in invocation of delete operator: [-Wdelete-incomplete]

delete p_dir;更改为free(p_dir);后,两个警告均消失了。 我不知道这是确切的原因,但听起来像DIR *类型像void *。我只是在疯狂猜测。

希望这会有所帮助。