我使用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
答案 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
的全局变量,并使其更容易。