int open(const char *path, int oflag, ... );
问题是它的参数不是固定的,
有没有办法包裹它?
int my_open(const char *path, int oflag, ... ){
}
答案 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()答案 4 :(得分:-2)