Преимущества уже упоминались здесь. Тем не менее, из следующих примеров есть недостаток:
class FileIn
{
public:
//Public interface like read
private:
void* handle;
};
Приведенный выше код очень хорошо вписывается в независимый от платформы заголовок, но пишет
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
class FileIn
{
public:
//Public interface like read
private:
HANDLE handle;
};
нет.
Хотя для первого потребуются ужасные типы типа
int fd=(int)( (size_t)handle );
close(fd);
Я не знаю ни одной системы, в которой есть sizeof(void*)
<<code>sizeof(int). Да, произойдет сбой, если open вернет отрицательное число для правильного дескриптора файла.
Что узнать об этом? Избегайте использования typedefs в библиотеках включаемых файлов. Вместо этого используйте объявления структуры, даже если программистам на С нужно написать struct
дюжину раз. Здесь некоторые реализации стандартной библиотеки C делают все это неправильно.
правый
В stdio.h
:
struct FILE;
А в приложении:
struct FILE* the_file=fopen("filename.txt","rb");
/*...*/
Неправильный
В stdio.h
:
typedef struct SOMENAMETHATNOONESHOULDUSE
{
/* Internal data members */
} FILE;
В приложении
FILE* the_file=fopen("filename.txt","rb");
При написании оболочки на C ++ это вызывает либо #include <cstdio>
, либо просто объявляет дескриптор, как указано выше.