我怎么环绕开?

时间:2011-10-15 02:18:33

标签: c

int open(const char *path, int oflag, ... );

问题是它的参数不是固定的,

有没有办法包裹它?

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

}

5 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:0)

C语言标准中没有定义open()函数。虽然由POSIX打开()

   int open(const char *pathname, int flags);
   int open(const char *pathname, int flags, mode_t mode);

Etienne问道 - “你想做什么”

答案 2 :(得分:0)

使用可选参数描述了open()函数的早期版本,但是现代POSIX将其定义为在其原型中具有, ...的可变参数函数。

将变量函数包装到另一个函数通常很困难,这就是标准有vfprintf()和朋友的原因。但由于open()的有效变体非常简单,第三个参数的存在或不存在由第二个参数的值确定,您可以使用更简单的方法。

编写自己的my_open()函数,使用<stdarg.h>访问可选的第三个参数。根据{{​​1}}的值,执行

oflag

return open(path, oflag);

答案 3 :(得分:-1)

如果不使用内联汇编或SWIG(用于调用C的库)

,则无法打开open()

http://www.swig.org/Doc1.3/Varargs.html

答案 4 :(得分:-2)

编辑:哇,圣洁的人们。由于OP的帖子现在已被完全重写以澄清他的问题,我建议另一个SO帖子进行了很好的讨论:Passing variable number of arguments around