BohYoh.comトップページへ
C & C++ FAQ
目次

C C++ openという名前の関数を自作したらfopen関数が正常に動作しなくなりました。

 以下のようなことが発生する処理系は、その作りがいい加減な処理系です。

openという名前の関数をプログラマが定義するとfopen関数の動作が不正になる

このような処理系では、ファイルをストリームに結びつけるfopen関数を以下のように定義しています。

/* 低水準入出力用のオープン関数 */ int open() { /* … */ } /* 標準入出力用のオープン関数 */ FILE *fopen(const char *name, const char *mode) { /* … */ open(); /* … */ }

ここで、fopen関数が、それとは別に定義さているopen関数を呼び出していることに注意してください。
fopen関数は、標準Cで定義されている標準入出力用のライブラリです。それに対して、open関数は、標準Cの規格が制定される前からUNIXやDOSで慣習的に利用されてきた低水準入出力用のライブラリであり、標準Cでは存在が認められていない関数です。
上記のように、内部でこっそりopen関数を呼び出すfopen関数は、その動作がopen関数に依存します。したがって、処理系が独自に提供しているopen関数でなく、ユーザが作成したopen関数を呼び出してしまうと、矛盾が生じてしまいます。
※ただし、このようなライブラリの実現方法は、標準Cのやり方に違反するものであり、本来は、このような問題が生じないような実現をすべき性質のものです。


■ 参照 ■
関数 fopen関数

戻る

BohYoh.comロゴ