我怎么环绕开?

Je *_*Rog 3 c

int open(const char *path, int oflag, ... );
Run Code Online (Sandbox Code Playgroud)

问题是它的论点不固定,

有没有办法包裹它?

int my_open(const char *path, int oflag, ... ){

}
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 6

要在一般情况下包装可变参数函数,它需要有一个变量,它将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);
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为可变参数函数的额外参数是无害的; 他们会被忽略.但是,if每次您关心的操作系统添加需要第三个参数的新标志时,您都需要更新条件.例如,这个答案的原始版本没有考虑到O_TMPFILE.(这是不是安全的无条件读第三个参数;如果编译器曾经成功地注意到,你在读这是没有通过参数,这将是鼻恶魔时间)