2012-01-09 110 views
1

我正在開源一些由我自己和其他一些人編寫的代碼。在被其他人的一個寫好的代碼段中的一個,我看到以下內容:打開的參數太多()

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都在同一個調用中被傳遞打開。

當我等待其他開發者的回覆時,有沒有人有一個想法,爲什麼有4個參數在open()這個調用?

+0

看起來很像一些版本控制版本合併在那裏出錯了,不是嗎? – Romain 2012-01-09 16:41:25

+0

我確實找到了打開(3)的手冊頁,其中包含可變參數列表。不知道爲什麼,但它在那裏。 http://linux.die.net/man/3/open – JoeFish 2012-01-09 16:45:54

回答

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 2012-01-09 16:56:50

+0

在我的情況下,奇怪的是,在Eclipse CDT中沒有這樣的錯誤,它的工作非常好。我正在轉向QtCreator並使用qmake來構建我的項目。這個錯誤發生在那裏。任何想法可能是問題與qmake和open()? – rbaleksandar 2014-07-03 07:55:20

+0

@rbaleksandar:問題中顯示的代碼通常發生的是第二個'O_WRONLY | O_CREAT'被視爲文件的'模式',所以你的文件,如果它被創建,就會以奇怪的權限結束。它'有效',但它沒有達到預期的效果。至於沒有收到編譯錯誤 - 這很正常。在大多數系統中,您不會因爲濫用'open()'而得到編譯錯誤,所以不要在不依賴編譯器的情況下濫用它。 – 2014-07-03 14:06:03

3

向您發送代碼的人只是搞砸了。根據你想要對文件做什麼,應該刪除第二個或第三個參數。欲瞭解更多信息,請參閱man page for open()