2012-01-09 5 views
1

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

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() передается слишком много аргументов (что, с моей точки зрения, является точным, поскольку открытые принимают только 2 или 3 аргумента, насколько мне известно). Я также довольно смущен относительно того, почему O_RDONLY | O_CREAT и O_WRONLY | O_CREAT оба передаются в один и тот же вызов для открытия.

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

+0

Похоже, что некоторые версии контроля версий слияния пошли не так, не так ли? – Romain

+0

Я нашел справочную страницу для open (3), которая принимает список vararg. Не знаю, почему, но вот оно. http://linux.die.net/man/3/open – JoeFish

ответ

6

В стандарте 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); 

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

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

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

+0

Спасибо за объяснение, почему он скомпилирован + выполнен в их системе, но не мой. Я должен был вспомнить о потенциале для varArgs, чтобы привести к таким условиям. – BSchlinker

+0

Странная вещь в моем случае такова, что в Eclipse CDT нет такой ошибки, и она работает отлично. В настоящее время я перехожу к QtCreator и использую qmake для создания моего проекта. Эта ошибка возникает там. Любая идея, что может быть проблемой с qmake и open()? – rbaleksandar

+0

@rbaleksandar: что обычно происходит с кодом, указанным в вопросе, является то, что второй 'O_WRONLY | O_CREAT' рассматривается как «режим» для файла, поэтому ваш файл, если он создан, заканчивается странными разрешениями. Он работает, но он не делает того, что ожидается. Что касается не получения ошибки компиляции - это нормально. В большинстве систем вы не получите ошибку компиляции для злоупотребления 'open()', поэтому научитесь не злоупотреблять ею, не полагаясь на компилятор. –

3

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