open()的参数太多

BSc*_*ker 1 c++ file-io gcc

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

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);
Run Code Online (Sandbox Code Playgroud)

一些如何,当我们需要执行它时,它在他们的系统上编译.然而,在我的系统上,海湾合作委员会抱怨open()传递了太多的论据(从我的角度来看,这是准确的,因为开放只接受我知道的2或3个论据).我也很困惑为什么O_RDONLY | O_CREAT和O_WRONLY | O_CREAT都被传递到同一个open的调用.

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

Jon*_*ler 6

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

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

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

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

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

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

原始代码被破坏了.修理它.并在新代码中修复它.