C实用程序在当前目录中打印文件名(Unix)

时间:2014-10-31 06:02:02

标签: c unix directory

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:警告:初始化使得整数指针没有强制转换

显然做一些非常愚蠢的事情并且可以使用一些帮助。

1 个答案:

答案 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如果你能处理它。