Это может быть глупый вопрос, но меня это очень интересует. Возможно ли реализовать оператор new
, динамически расширяющиеся массивы, классы в чистом C? Будут оценены любые ссылки или примеры кода.Использование возможностей C++ в C
ответ
new
:#define new(type) malloc(sizeof(type))
(должны вызвать его, используя синтаксис функции, какstruct stat *st = new(struct stat)
)- динамически расширяемые массивы:
realloc
плюс некоторые функции пользовательского массива манипуляции (какpush_back
и т.д.) - это обычно реализуется третий (и, как указывает @Mgetz, некоторые компиляторы имеют встроенные расширения) - классы: structs с элементами указателей функций (это очень часто встречается в нескольких проектах, таких как ядро Linux)
Возможно, вы захотите посмотреть на GObject, который представляет собой библиотеку C, предоставляющую некоторые объектно-ориентированные функции C. Также см. Десятки хитов, которые вы получаете для поиска по объектам «Объектно-ориентированный C».
У gcc действительно были свои собственные ['VEC_' макросы] (https://github.com/gcc-mirror/gcc/blob/gcc-4_3-branch/gcc/vec.h), которые сделали большую часть того, что просит ОП для. Хотя они постепенно прекращаются с преобразованием C++. – Mgetz
Если пользователь собирается определить макрос 'new', который, скорее всего, будет выполнен в защитнике' #ifndef __cplusplus', – dtech
@ddriver не должен, скорее всего, ДОЛЖЕН быть выполнен в таком блоке. Поскольку переопределение ключевых слов является ошибкой компиляции в C++ – Mgetz
Это зависит от того, подходит ли вам для переопределения компилятора. Если все в порядке - вы можете делать все, что пожелаете, иначе:
новый - в качестве оператора - нет, но вы можете определить функцию + макросы, которые будут имитировать ее. классы - да, вы можете. вы можете довольно точно имитировать его со статическими функциями и массивом указателей на функции. Но перегрузки не будет. Расширяющиеся массивы - да, с помощью моделирования классов выше.
Это вовсе не «переопределение компилятора», а крошечное подмножество! Кроме того, это сделает OP понятным для других разработок! Не давайте другим ложные впечатления от вещей, которые абсурдны !!! –
@shekharsuman, если это абсурдно для вас - это не значит, что это для всех. Конечно, я не собирался перестраивать его с нуля - но вы можете реализовать некоторые функции в коде компилятора или использовать utils, такие как [codeworker] (http://codeworker.free.fr/) или другие – ibnLoki
Быстрый поиск Google показал следующее: http://ooc-coding.sourceforge.net/
Не прочитал его, но это звучит как то, что вы после этого.
Да, возможно (обычное?) Реализовать объектно-ориентированность в C - или, по крайней мере, биты, которые особенно необходимы.
Примером является созданный сборщик мусора, сохраняющий указатели на malloced memory и свободную функцию в связанных списках.
Самое лучшее, что касается C, это то, что он просто работает, и почти нулевые накладные расходы. Чем больше работы язык делает для вас автоматически может означает, что накладных расходов намного больше - хотя это не всегда так.
Тема слишком широкая, но проверьте эту бесплатную книгу, которая точно описывает ООП в C: http://www.cs.rit.edu/~ats/books/ooc.pdf – dtech
@ddriver, спасибо за ссылка. Действительно полезный. – ForceBru
Очевидно, что вы * можете * делать эти вещи на C, потому что первые компиляторы C++ для Stoustrop выводят C. Но это большая работа. –