あなたがそれでtypedefを#include <stdio.h>
取得する必要がある場合。FILE
これが唯一の本当に安全で移植性のある方法です。エイリアスする型がないとtypedefを使用できず、どの型FILE
エイリアスであるかについての保証はありません。したがって、すべてのコンパイラやlibcなどが異なるものを持つことができます。#include <stdio.h>
しかし、一貫性のない定義がエラーを引き起こさないように、誰かが実際にそうしたい場合に備えて、タイプが正しい必要があります。
編集:
今考えてみると、もう一つ考えられる方法があるかもしれません。これはtypedefではなく、「FILE」の定義を乗っ取って機能する邪悪なマクロです。その理由だけではお勧めしません。しかし、それはあなたが必要とするもののために働くかもしれません。
#ifdef USES_REAL_FILE_TYPE
#include <stdio.h>
#else
#define FILE void
#endif
/* declare your struct here */
#ifndef USES_REAL_FILE_TYPE
#undef FILE
#endif
次に#define USES_REAL_FILE_TYPE
、実際のが必要なコードにファイルを含める前にFILE *
、残りのコードはポインターを。として表示しますvoid *
。
私はこれが物事を台無しにしないことを保証しません。特に、そのような偽の型について実際に何かを知りたい場合は壊れ、ポインタに触れるすべてのコードでその#defineが必要になる場合があります。しかし、「不要な」#includesに完全に反対している場合はFILE *
、stdioに干渉せずにそれを取得する唯一の方法です。typedefを前方宣言することはできません。
Edit2:
OK、念のためチェックしました。それがどれほど標準的であるか、またはあなたがそれで何ができるかはわかりませんが...
typedef FILE;
Visual CとGCCの両方で機能しますが、 Cコードをコンパイルする場合に限ります。C ++標準では、型なしではtypedefを使用できないと明示的に示されているように見えます。ただし、Cのものはそうではありません。
ただし、GCCではなく、型を前方宣言することはできないようです。typedef int FILE;
すぐに実行しようとすると、typedefの競合に関するエラーがスローされます。ただし、VSは、整数型である限り、それを許可しているようです。VSでは(そして明らかにC99では)本当にtypedef X
意味があるようです。typedef int X
いずれにせよ、GCCでは、まったく同じタイプであっても、typedefをやり直すことはできません。