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/

10-09 08:56