2

我正在使用 scandir 来匹配目录中的某些文件。match 函数接受const struct dirent *dp参数。

但我还需要用它传递另一个论点。当我尝试这样做时,compiles 会给我一个警告(不是错误),我的 match 函数是不兼容的指针类型。

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

代码片段:

/* 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

4 回答 4

2

做你想做的事情的唯一可移植和线程/库安全的方法是使用 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);
}

如果您不关心线程安全,则可以使用全局变量 forstr并使其更容易。

于 2011-07-15T02:30:06.207 回答
2

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

这是一个可能的实现scandir

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

于 2011-07-15T02:34:40.500 回答
2

明确回答您的问题

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

没有。作者scandir()指定了match它期望的函数类型;作为您的用户,scandir()您必须遵循该规范,或者编写您自己的等效项,按照R..scandir()的建议按照您想要的方式做事。

于 2011-07-15T03:42:24.277 回答
0

想一想:您将如何将附加参数传递给它?您可能正在寻找的是一个闭包,虽然gcc它显然能够通过嵌套函数来实现,但 C 标准还不支持它。

于 2011-07-15T00:30:16.410 回答