scandir匹配函数参数

时间:2011-07-15 00:20:35

标签: c function-prototypes scandir

我使用scandir来匹配dir中的某些文件。匹配函数采用const struct dirent *dp参数。

但我还需要传递另一个论点。当我尝试这样做时,编译给了我一个警告(而不是错误),我的匹配函数是不兼容的指针类型。

是否不允许传递另一个参数来匹配函数?如果不是,我可能不得不将这个特定的变量设为全局,我不想这样做。

代码段:

/* below I am adding new argument - char *str */
match_function (const struct dirent *dp, char *str) {
}

function() {
count = scandir(PATH, &namelist, match_function, alphasort);
}

警告:

warning: passing argument 3 of 'scandir' from incompatible pointer type

4 个答案:

答案 0 :(得分:2)

另一种方法,可能比使用全局变量或特定于线程的数据更可取,只是为scandir编写自己的替换,并且需要额外的void *参数,它将传递给匹配功能。考虑到scandir很容易在不到50行代码中实现,这是完全合理的。

以下是scandir

的可能实现

http://git.etalabs.net/cgi-bin/gitweb.cgi?p=musl;a=blob;f=src/dirent/scandir.c

答案 1 :(得分:2)

明确回答您的问题

  

是否不允许传递另一个参数来匹配函数?

没有。 scandir()的作者指定了它所期望的match函数的类型;作为scandir()的用户,您必须遵循该规范,或者编写自己的scandir() - 相当于按照R..的建议按照您的方式执行操作。

答案 2 :(得分:1)

想一想:你如何将附加参数传递给它?你可能正在寻找的是一个闭包,虽然gcc显然有能力通过nested functions来完成,但C标准并不支持闭包。

答案 3 :(得分:1)

唯一可移植和线程/库安全的方法是使用POSIX线程专用数据。

static pthread_key_t key;
static pthread_once_t init = PTHREAD_ONCE_INIT;
static void initfunc()
{
    int r = pthread_key_create(&key);
    assert(r==0);
}

match_function (const struct dirent *dp)
{
    char *str = pthread_getspecific(key);
    /* ... */
}

function() {
    pthread_once(&init, initfunc);
    pthread_setspecific(key, str);
    count = scandir(PATH, &namelist, match_function, alphasort);
}

如果你不关心线程安全,你可以使用str的全局变量,并使其更容易。