2014-12-15 2 views
1

Это может быть глупый вопрос, но меня это очень интересует. Возможно ли реализовать оператор new, динамически расширяющиеся массивы, классы в чистом C? Будут оценены любые ссылки или примеры кода.Использование возможностей C++ в C

+1

Тема слишком широкая, но проверьте эту бесплатную книгу, которая точно описывает ООП в C: http://www.cs.rit.edu/~ats/books/ooc.pdf – dtech

+0

@ddriver, спасибо за ссылка. Действительно полезный. – ForceBru

+0

Очевидно, что вы * можете * делать эти вещи на C, потому что первые компиляторы C++ для Stoustrop выводят C. Но это большая работа. –

ответ

2
  • new: #define new(type) malloc(sizeof(type)) (должны вызвать его, используя синтаксис функции, как struct stat *st = new(struct stat))
  • динамически расширяемые массивы: realloc плюс некоторые функции пользовательского массива манипуляции (как push_back и т.д.) - это обычно реализуется третий (и, как указывает @Mgetz, некоторые компиляторы имеют встроенные расширения)
  • классы: structs с элементами указателей функций (это очень часто встречается в нескольких проектах, таких как ядро ​​Linux)

Возможно, вы захотите посмотреть на GObject, который представляет собой библиотеку C, предоставляющую некоторые объектно-ориентированные функции C. Также см. Десятки хитов, которые вы получаете для поиска по объектам «Объектно-ориентированный C».

+0

У gcc действительно были свои собственные ['VEC_' макросы] (https://github.com/gcc-mirror/gcc/blob/gcc-4_3-branch/gcc/vec.h), которые сделали большую часть того, что просит ОП для. Хотя они постепенно прекращаются с преобразованием C++. – Mgetz

+4

Если пользователь собирается определить макрос 'new', который, скорее всего, будет выполнен в защитнике' #ifndef __cplusplus', – dtech

+0

@ddriver не должен, скорее всего, ДОЛЖЕН быть выполнен в таком блоке. Поскольку переопределение ключевых слов является ошибкой компиляции в C++ – Mgetz

-1

Это зависит от того, подходит ли вам для переопределения компилятора. Если все в порядке - вы можете делать все, что пожелаете, иначе:

новый - в качестве оператора - нет, но вы можете определить функцию + макросы, которые будут имитировать ее. классы - да, вы можете. вы можете довольно точно имитировать его со статическими функциями и массивом указателей на функции. Но перегрузки не будет. Расширяющиеся массивы - да, с помощью моделирования классов выше.

+0

Это вовсе не «переопределение компилятора», а крошечное подмножество! Кроме того, это сделает OP понятным для других разработок! Не давайте другим ложные впечатления от вещей, которые абсурдны !!! –

+0

@shekharsuman, если это абсурдно для вас - это не значит, что это для всех. Конечно, я не собирался перестраивать его с нуля - но вы можете реализовать некоторые функции в коде компилятора или использовать utils, такие как [codeworker] (http://codeworker.free.fr/) или другие – ibnLoki

0

Быстрый поиск Google показал следующее: http://ooc-coding.sourceforge.net/

Не прочитал его, но это звучит как то, что вы после этого.

Да, возможно (обычное?) Реализовать объектно-ориентированность в C - или, по крайней мере, биты, которые особенно необходимы.

Примером является созданный сборщик мусора, сохраняющий указатели на malloced memory и свободную функцию в связанных списках.

Самое лучшее, что касается C, это то, что он просто работает, и почти нулевые накладные расходы. Чем больше работы язык делает для вас автоматически может означает, что накладных расходов намного больше - хотя это не всегда так.