Как понять stdio.h разные на разных операционных системах - PullRequest
1 голос
/ 28 августа 2011

Прежде всего, я говорю о UNIX-подобных системах.

Я смотрю на определение структуры "ФАЙЛ" в книге Mac OS, Linux, Minix и K & R C, все они разные.

В книге K & R C это совершенно ясно

typedef struct _iobuf{
    int cnt;
    char *ptr;
    char *base;
    int  flag;
    int  fd;
} FILE;

в Mac OS, в структуре есть больше вещей.

в Linux (3.0), это

typedef _IO_FILE FILE;

Заголовок гласит: «Определите ISO C stdio поверх C ++ iostreams». Эм ...? (C на Linux реализованы на C ++? Разве это не должно быть наоборот?) Похоже, определение _IO_FILE в libio.h

на Minix, определение очень похоже на K & R.

Мое непрочитанное было stdio.h должно быть частью C. Первый компилятор C реализован на ассемблере. И C должен быть независимым от типа ОС.

машинный код на HW -> asm -> C -> более сложный C -> UNIX

И теперь, есть разные stdio.h на разных ОС (все виды UNIX), и все компиляторы gcc.

Как это понять?

Большое спасибо, Альфред

Ответы [ 2 ]

5 голосов
/ 28 августа 2011

Структура FILE зависит от платформы, и ее поля внутренне используются библиотекой C. Вы не должны полагаться на то, что внутри него.

1 голос
/ 28 августа 2011

Ваш собственный C-код не должен зависеть от ОС. Заголовки C и внутренняя реализация CRT зависят от ОС. Смысл кроссплатформенного программирования: написать код, скомпилировать его в разных ОС, и он должен работать. Однако базовые инструменты (C, кроссплатформенные библиотеки) взаимодействуют с API-интерфейсами, специфичными для ОС, и отличаются в разных ОС.

Конечно, вы не должны использовать поля непрозрачных структур, это нарушает независимый от платформы код.

...