Если вы #include <stdio.h>
, вы должны получить FILE
typedef вместе с ним. Это единственный действительно безопасный и переносимый способ - вы не можете иметь typedef без псевдонима типа, и нет никакой гарантии относительно псевдонимов типа FILE
, так что каждый компилятор или libc или любой другой может иметь свой собственный. Но вам нужно, чтобы тип был корректным в случае, если кто-то действительно хочет #include <stdio.h>
, чтобы противоречивые определения не привели к ошибке.
Edit:
Теперь, когда я думаю об этом, я могу думать о другом. Это не 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. Но если вы настроены против «ненужного» #include, это единственный способ получить FILE *
без вмешательства в stdio. Вы не сможете перенаправить объявление typedef.
Edit2:
ОК, я проверил только чтобы убедиться. Не уверен, насколько он стандартен или что с ним можно сделать, но ...
typedef FILE;
работает как в Visual C, так и в GCC, но только при компиляции кода C. Похоже, что стандарт C ++ явно говорит где-то, что вы не можете иметь typedef без типа. C, однако, не делает.
Однако, по-видимому, он не допускает прямого объявления типа, во всяком случае, в GCC. Если вы попытаетесь typedef int FILE;
сразу после этого, он выдаст ошибку о конфликте типов. VS, однако, кажется, позволяет это, пока это к целочисленному типу. Кажется, typedef X
действительно означает typedef int X
в VS (и, видимо, в C99). В любом случае, GCC не позволит вам повторить typedef, даже к тому же типу.