int open(const char *path, int oflag, ... );
问题在于它的参数不固定,
有没有办法环绕它?
int my_open(const char *path, int oflag, ... ){
}
最佳答案
要包装一般情况下的可变参数函数,它需要具有一个以va_list
作为参数的变体(例如,这是vprintf
函数族的用途)。
但是,open
只能有两个或三个参数,因此可以有条件地读取第三个参数,而无条件地将三个参数传递给实际的open
来包装它:
#ifndef O_TMPFILE
# define O_TMPFILE 0
#endif
int my_open(const char *pathname, int flags, ...)
{
mode_t mode = 0;
if (flags & (O_CREAT|O_TMPFILE))
{
va_list ap;
va_start(ap, flags);
mode = va_arg(ap, mode_t);
va_end(ap);
}
// ... do what you need to do here ...
return open(pathname, flags, mode);
}
之所以可行,是因为可变参数函数的额外参数是无害的。他们只会被忽略。但是,每次您关心的操作系统添加需要第三个参数的新标志时,都需要更新
if
条件。例如,此答案的原始版本未考虑O_TMPFILE
。 (无条件地读取第三个参数是不安全的;如果编译器设法注意到您正在读取未传递的参数,那将是一次恶魔般的时间。)关于c - 我如何环绕开放?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7775317/