我正在尝试编译此代码,该代码在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'
我忘了什么吗? 或者是否存在逻辑错误?
修改:我已经添加了上面的包含(我已经在使用)。
答案 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 *
。我只是在疯狂猜测。
希望这会有所帮助。