C和Unix相当新。
我目前有:
#include "stdio.h"
#include <dirent.h>
#include <unistd.h>
int main(int argc, char ** argv)
{ char * current = get_current_dir_name(); //where error occurs
DIR * directory = NULL;
directory = opendir(current);
if(directory == NULL)
return -1;
struct dirent * ent;
while((ent = readdir (directory)) != NULL)
printf("%s\n", ent -> d_name);
if(closedir(directory) < 0)
return -1;
}
我被告知:dir.c:15:警告:初始化使得整数指针没有强制转换
显然做一些非常愚蠢的事情并且可以使用一些帮助。
答案 0 :(得分:2)
获取当前工作目录名称的标准函数是getcwd()
,而不是get_current_dir_name()
。 get_current_dir_name()
是GNU扩展,仅在包含_GNU_SOURCE
之前定义宏<unistd.h>
时才可用,并且不推荐使用它。
在您的情况下,_GNU_SOURCE
未定义,因此get_current_dir_name()
不是声明函数的名称。因此,当C编译器看到您尝试调用它时,它会生成隐式声明。
隐式函数声明在使用点创建一个声明,声明函数接受任意数量和类型的参数并返回int
。因此,在这种情况下,编译器认为它已将int
分配给类型为char*
的变量,因此它生成“初始化从整数生成指针而没有强制转换警告”。
隐式声明是C语言的一个不推荐使用的功能,实际上已从该语言的C99版本中删除,尽管现代编译器仍然经常接受它们(带警告),即使在C99模式下也是如此。即使在C89模式下,我强烈建议您使用尽可能高的警告级别进行编译,以捕获这样的错误,例如: -Wall -Wextra -Werror -pedantic
如果你能处理它。