open()的参数太多

时间:2012-01-09 16:38:20

标签: c++ gcc file-io

我正在开源一些由我自己和其他一些人编写的代码。在其中一个人编写的代码段之一中,我看到以下内容:

open(filePath, O_RDONLY | O_CREAT, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
open(filePath, O_WRONLY | O_CREAT, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

有些如何,当我们需要执行它时,它会在他们的系统上编译。然而,在我的系统上,GCC抱怨open()传递的参数太多(从我的角度来看,这是准确的,因为open只接受我知道的2或3个参数)。我也很困惑为什么O_RDONLY | O_CREATO_WRONLY | O_CREAT都在同一个open的调用中被传递。

在我等待其他开发人员的回复时,是否有人知道为什么在此次open()调用中有4个参数?

2 个答案:

答案 0 :(得分:6)

在POSIX标准中,open()的C接口声明为:

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

现在,你只能提供一个额外的参数,但编译器无法阻止你提供更多参数。如果您正在使用C ++进行编译,那么可能是您重载了open()的声明:

int open(const char *path, int oflag);
int open(const char *path, int oflag, mode_t mode);

这将更准确地反映出预期。肯定有一些问题需要解决,但可以做到。

因此,编译可能在一台机器上运行,因为它使用了带有可变长度参数列表的“官方”声明。在您的系统上,您似乎受到了更好的约束。

原始代码已损坏。修理它。并在新代码中修复它。

答案 1 :(得分:3)

向你发送该代码的人只是搞砸了。应删除第二个或第三个参数,具体取决于您要对文件执行的操作。有关详细信息,请参阅man page for open()