2012-01-09 10 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()があまりにも多くの引数を渡していると不満を抱いています(私の見解からは正確です。私はどちらも、なぜ同じO_RDONLY | O_CREATO_WRONLY | O_CREATが両方とも同じ呼び出しでopenに渡されているのか混乱しています。

他の開発者の意見が聞こえるのを待っている間に、この呼び出しで4つの引数がある理由について誰もが考えていますか?open()? POSIX標準で

+0

バージョンコントロールのリビジョンマージが間違っているようですね。 – Romain

+0

私はvarargリストを取るopen(3)のマニュアルページを見つけました。理由は分かりませんが、そこにはあります。 http://linux.die.net/man/3/open – JoeFish

答えて

6

は、open()にCインタフェースは次のように宣言されています。今

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

をこれは、より正確に予想されるものを反映することになります。間違いなくそれを実装することが解決されるいくつかの問題がありますが、それを行うことができます。

したがって、可変長引数リストで「公式」宣言を使用していたため、コンパイルはおそらく1台のマシンで機能していました。あなたのシステムでは、あなたはより良く拘束されているようです。

元のコードが壊れています。修理する。新しいコードで修正してください。

+0

コンパイルされた理由を説明してくれてありがとう+私のシステムではなく、自分のシステムで実行されます。私は、varArgsがこのような状況に陥る可能性を覚えていたはずです。 – BSchlinker

+0

私の場合、奇妙なことに、Eclipse CDTでは、このようなエラーはなく、完全に正常に動作しています。私は現在、QtCreatorに移動しており、プロジェクトを構築するためにqmakeを使用しています。このエラーが発生します。 qmakeとopen()の問題は何でしょうか? – rbaleksandar

+0

@rbaleksandar:質問に表示されるコードで通常起こるのは、2番目の 'O_WRONLY | O_CREAT'はファイルの 'モード'として扱われます。ファイルが作成されていれば、そのファイルは奇妙なパーミッションで終了します。それは「うまくいっている」が、期待されることはしない。コンパイルエラーが発生しないため、これは正常です。ほとんどのシステムでは、 'open()'の悪用に関するコンパイルエラーは発生しませんので、コンパイラに頼らずに悪用しないでください。 –

3

あなたにそのコードを送った人々はちょうどうんざりしました。ファイルで何をしたいかによって、2番目または3番目の引数を削除する必要があります。詳細は、man page for open()を参照してください。

関連する問題