Слишком много аргументов для open () - PullRequest
1 голос
/ 09 января 2012

Я нахожусь в процессе открытого поиска некоторого кода, который был написан мной и несколькими другими людьми.В одном из сегментов кода, написанных одним из других людей, я вижу следующее:

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_CREAT и O_WRONLY | O_CREAT оба передаются в одном вызове для открытия.

Пока я жду ответа от другого разработчика, есть ли у кого-нибудь идея какпочему в этом вызове 4 аргумента open()?

Ответы [ 2 ]

6 голосов
/ 09 января 2012

В стандарте POSIX интерфейс C для 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);

Это будет более точно отражать то, что ожидается.Определенно, есть некоторые проблемы, которые необходимо решить, реализуя это, но это может быть сделано.

Итак, компиляция, вероятно, работала на одной машине, потому что она использовала «официальное» объявление со списком аргументов переменной длины.В вашей системе вы, кажется, более ограничены.

Оригинальный код не работает.Почини это.И исправьте это в новом коде.

3 голосов
/ 09 января 2012

Люди, которые прислали вам этот код, просто запутались.Второй или третий аргумент должен быть удален, в зависимости от того, что вы хотите сделать с файлом.Для получения дополнительной информации см. Справочную страницу для open () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...