c++ - open() 的参数太多

标签 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() 的调用中有 4 个参数吗?

最佳答案

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

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);

这会更准确地反射(reflect)预期的结果。实现这一点肯定有一些问题需要解决,但这是可以做到的。

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

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

关于c++ - open() 的参数太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791846/

相关文章:

macos - 汇编语言中的数组访问

c++ - 链接本身依赖于静态库的自己的静态库时的 undefined reference

java - 二维数组的列和行的总和

C++11 将 unique_ptr 转换为基类

c++ - 使用 Boost Graph 搜索 DAG Graph?

c - GCC_NO_EXECUTABLES ---交叉编译工具链后不允许进行链接测试

c - 更改文件(不使用 fseek 或 + 模式)或以最少的复制连接两个文件

python - 是否可以在同一个 Jupyter notebook 中运行 C++ 和 Python 代码

c++ - Xcode 和 C++ header

c - 恐惧必须井然有序吗?