【问题标题】:Warning with nftw使用 nftw 发出警告
【发布时间】:2009-04-23 15:44:31
【问题描述】:

我正在尝试使用nftw 来处理目录下的一些文件

#include <ftw.h>
#include <stdio.h>

 int wrapper(const char * fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
  printf("File %d\n", ftwbuf->base);
  return(0);
} 


int main(int argc, char ** argv) {
    const char *name;
    int flags = 0;
    name = argv[1];
    nftw(name, wrapper, 20, flags);
    return 0;

}

当我在编译 (gcc kconfig_parser.c -o parser) 时,我收到了这个警告和这个错误..

kconfig_parser.c:5: warning: ‘struct FTW’ declared inside parameter list 
kconfig_parser.c:5: warning: its scope is only this definition or declaration, which is probably not what you want
kconfig_parser.c: In function ‘wrapper’:
kconfig_parser.c:6: error: dereferencing pointer to incomplete type

我检查了结构的定义和回调的原型,还有一些例子,应该没问题...我做错了什么? (我已经删除了几乎所有代码来清除它)...

谢谢

【问题讨论】:

    标签: c linux unix posix


    【解决方案1】:

    出于某种原因,Linux 仍然为此 API 使用 SUSv1,其中 nftw() 仍被视为扩展。

    来自 Linux manual page,包含必须是:

    #define _XOPEN_SOURCE 500
    #include <ftw.h>
    

    【讨论】:

    • 实际上,我链接到 SUSv2 规范以了解 nftw 应该如何工作(我已经更新到 SUSv3 链接)。在 SUSv2 或 SUSv3 兼容的系统上,您不应该需要该 #define,但看起来您可能在 Linux 上需要它。
    • 布赖恩:事实上,你是对的。在新手册页的底部,您可以阅读:“问题 5:从 X/OPEN UNIX 扩展移动到 BASE。”。因此,它最初是一个 X/OPEN 扩展,然后移至基础。由于某种原因,Linux 仍在使用该 API 的 SUSv1。
    • 请注意:#define 必须在包含第一个标头之前,甚至是不相关的标头。
    【解决方案2】:

    嗯。你的代码对我有用。检查您的包含路径,也许?虽然这是一个系统头文件,所以应该很难错过它。还是您不小心编译了一个没有#include &lt;ftw.h&gt; 行的版本?

    $ gcc -o ftw ftw.c
    $ ./ftw my-directory
    File 10
    File 11
    File 16
    File 16
    File 16
    File 16
    File 16
    ... etc ...
    

    编辑:上面的测试是在 Mac OS X 上完成的。在(现已删除)评论中,OP 提到他在 Debian 上,the man page 提到#define _XOPEN_SOURCE 500 是必要的,正如 Juliano 指出的那样。

    【讨论】:

      【解决方案3】:

      在 CentOs 版本上,头文件没有使用“#define _XOPEN_SOURCE 500” 我必须在下面这样做,

      #define __USE_XOPEN_EXTENDED 1
      #include <ftw.h>
      

      【讨论】:

      • 与 Ubuntu 相同,可能还有其他基于 Debian 的发行版。由于某些疯狂的原因,默认情况下禁用了这个关键的标准 UNIX C 资源。
      【解决方案4】:

      在 Ubuntu 18.04 上,这似乎现在可以工作(类似于 JohnMeg 提到的 CentOS)。

      #define __USE_XOPEN_EXTENDED 1 #include <ftw.h>

      【讨论】:

      • 这更像是一个评论而不是一个答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多