【问题标题】:C utility to print filenames in current directory (Unix)用于在当前目录中打印文件名的 C 实用程序 (Unix)
【发布时间】:2014-10-31 06:02:02
【问题描述】:

对 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: 警告:初始化使指针从整数而不进行强制转换

显然做了一些非常愚蠢的事情,并且需要一些帮助。

【问题讨论】:

  • get_current_dir_name() 声明在哪里?你的警告告诉你问题 - C 认为 get_current_dir_name() 正在返回一个 int (没有人告诉它的默认类型)
  • 为什么stdio" "里面

标签: c unix directory


【解决方案1】:

获取当前工作目录名称的标准函数是getcwd(),而不是get_current_dir_name()get_current_dir_name() 是一个 GNU 扩展,只有在包含 &lt;unistd.h&gt; 之前定义了宏 _GNU_SOURCE 时才可用,不建议使用它。

在您的情况下,_GNU_SOURCE 未定义,因此get_current_dir_name() 不是已声明函数的名称。因此,当 C 编译器看到您尝试调用它时,它会生成一个隐式声明

隐式函数声明在使用点创建一个声明,声明函数接受任意数量和类型的参数并返回int。因此,在这种情况下,编译器认为它有一个 int 被分配给一个类型为 char* 的变量,因此它会生成“初始化从整数生成指针而没有强制转换警告”。

隐式声明是 C 语言的一个弃用功能,实际上已从该语言的 C99 版本中删除,尽管即使在 C99 模式下,现代编译器仍然经常接受它们(带有警告)。即使在 C89 模式下,我也强烈建议您编译时使用尽可能高的警告级别以捕获此类错误,例如-Wall -Wextra -Werror -pedantic如果你能应付的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2012-02-27
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多