Как стать автором
Обновить

Комментарии 10

Раз уж заговорили об ООП, в GCC можно реализовать прозрачное наследование:

struct base
{
   int a;
};

struct derived
{
   struct base;
   int b;
};

int main()
{
    struct derived x;
    x.a = 42;
    struct base* y = &x;
    printf("%d", y->a);
}

Работает только в GCC с параметром -fms-extensions.
НЛО прилетело и опубликовало эту надпись здесь

Да, и про обращение через базовый указатель чуть ниже.

НЛО прилетело и опубликовало эту надпись здесь
Это работает где угодно, начиная с C99 (или 98?). «Указатель на структуру равен указателю на первый элемент этой структуры».
Нет, не работает. Без "-fms-extensions" строка

struct base;

внутри struct derived будет воспринята как forward declaration некоей локальной по отношению к derived структуры base (компилятор в этом месте выдаст предупреждение, что «declaration does not declare anything»), и вот в этом месте:

x.a = 42;

компилятор ругнется, что «struct derived has no member named a». А с "-fms-extensions" все соберется и будет работать.
Ну не совсем «прозрачное», все-таки придется следить за тем, чтобы в структурах-наследниках не появлялись члены с именами, которые уже есть в структурах-предках, иначе ничего не соберется. Но в целом да, забавное расширение.
поскольку Си++ совместим с Си, примеры использованные в Си могут применены в обоих языках.
Нет, не могут, если только под «применить» не подразумевалось «скомпилировать в буквальном виде». Нельзя просто взять и перенести объявление полей класса в cpp файл, потому что плюсам нужно знать реальный размер класса для его аллокации, а для этого они должны быть в заголовочном файле. Чтобы скрыть поля в C++ схожим образом нужно использовать технику PIMPL.
да, я абсолютно с вами согласна. изменю текст статьи, спасибо
Чтобы не извращаться с TU, Gustedt предложил Modular C (Мотивация, Реализация). Это не отдельный язык, а расширение нашего дорогого и привычного С.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории