Функции C++, который не может быть реализован в C?

Это действительно не отвечает на Ваш вопрос, но я слушал подкаст на Pex от microsoft, который делает подобную вещь к решению, которое Вы предлагаете и когда я слушал его, я не забываю думать, что было бы действительно интересно видеть, будет ли это в состоянии протестировать игры. Я не знаю, было ли это в состоянии помочь Вам а именно, но возможно Вы могли бы смотреть на некоторые идеи, они используют и применяют его к Вашему поблочному тестированию.

8
задан Joachim Sauer 1 December 2009 в 13:11
поделиться

14 ответов

Как насчет RAII и шаблонов .

11
ответ дан 5 December 2019 в 04:35
поделиться

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

Конечно, вы можете реализовать, смоделировать, подделать или эмулировать большинство функций C ++ в C, но полученный код, вероятно, будет менее читабельным или поддерживаемым. Языковая поддержка функций ООП позволяет выражать код, основанный на объектно-ориентированном дизайне , гораздо легче, чем на языке, отличном от ООП. Если бы C был вашим предпочтительным языком, то часто OOD может быть не лучшей методологией проектирования для использования - или, по крайней мере, широкое использование продвинутых идиом OOD может быть нецелесообразным.

Конечно, если у вас нет дизайна, тогда вы, вероятно, чтобы получить беспорядок на любом языке! ;)

тогда вы, скорее всего, запутаетесь на любом языке! ;)

тогда вы, скорее всего, запутаетесь на любом языке! ;)

4
ответ дан 5 December 2019 в 04:35
поделиться

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

Fakeable:

  • Inheritance (указатель на родительскую структуру в дочерней структуре )
  • Полиморфизм (Подделка vtable с помощью группы указателей функций)
  • Инкапсуляция данных (непрозрачные субструктуры с реализацией, не представленной в общедоступном интерфейсе)

Невозможно:

  • Шаблоны (которые могут быть хорошо называться этапом препроцессора 2)
  • Перегрузка функции / метода аргументами (некоторые пытаются эмулировать это с помощью эллипсов, но никогда не приближается)
  • RAII (Конструкторы и деструкторы автоматически вызываются в C ++, поэтому ваши ресурсы стека безопасно обрабатываются в пределах их области действия)
  • Сложные операторы приведения (в C вы можете приводить почти что угодно)
  • Исключения

Стоит проверить:

  • GLib (библиотека C) имеет довольно сложную ОО-эмуляцию
  • Я однажды опубликовал вопрос о том, что люди больше всего упускают из виду, когда используют C вместо C ++.

Пояснение к RAII:

Эта концепция обычно неверно истолковывается, когда дело доходит до ее наиболее важного аспекта - неявного управления ресурсами, то есть концепции гарантии (обычно на уровне языка) что ресурсы обрабатываются правильно. Некоторые считают, что достижение RAII может быть достигнуто, оставив эту ответственность программисту (например, явный вызов деструктора на метках goto), который, к сожалению, не приближается к обеспечению принципов безопасности RAII в качестве концепции дизайна.

Цитата из статьи в Википедии, которая разъясняет этот аспект RAII:

«Следовательно, ресурсы должны быть привязаны к сроку службы подходящих Они приобретаются во время инициализации, когда нет шансов, что они будут использованы до того, как они станут доступны, и освобождаются с уничтожением тех же объектов , что гарантированно произойдет даже в случае ошибок . "

23
ответ дан 5 December 2019 в 04:35
поделиться

Вы можете полностью реализовать C ++ на C ... Исходный компилятор C ++ от AT + T фактически был препроцессором с именем CFront, который просто транслировал код C ++ в C и скомпилировал его.

Такой подход до сих пор используется comeau computing , которые производят один из наиболее совместимых со стандартами C ++ компиляторов, например. Он поддерживает все функции C ++.

3
ответ дан 5 December 2019 в 04:35
поделиться

Что ж, если вы не собираетесь реализовывать компилятор C ++ с использованием C, есть тысячи вещей, которые вы можете сделать с C ++, но не с C. И это лишь некоторые из них:

  • В C ++ есть классы. Классы имеют конструкторы и деструкторы, которые автоматически вызывают код, когда объект инициализируется или удаляется (выход за пределы области действия или с ключевым словом delete).
  • Классы определяют иерархию. Вы можете расширить класс. (Наследование)
  • C ++ поддерживает полиморфизм. Это означает, что вы можете определять виртуальные методы. Компилятор выберет метод для вызова в зависимости от типа объекта.
  • C ++ поддерживает информацию о времени выполнения.
  • Вы можете использовать исключения с C ++.

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

3
ответ дан 5 December 2019 в 04:35
поделиться
  1. В стандартной библиотеке C есть только один printf () . Другие разновидности реализуются путем изменения имени, например sprintf () , fprintf () и т. Д.

  2. Структуры не могут скрыть реализацию, нет частные данные в C. Конечно, вы можете скрыть данные, не показывая, например, на что указывают указатели, как это делается для FILE * стандартной библиотекой. Таким образом, существует абстракция данных, но не как прямая особенность конструкции struct .

Кроме того, вы не можете перегружать операторы в C, поэтому a + b всегда означает, что происходит какое-то дополнение. В C ++, в зависимости от типа задействованных объектов, могло случиться что угодно.

Обратите внимание, что это подразумевает (тонко), что + в C на самом деле переопределено; int + int - это не тот же код, что, например, float + int . Но вы не можете сделать такое переопределение самостоятельно, это только для компилятора.

3
ответ дан 5 December 2019 в 04:35
поделиться

printf использует список аргументов переменной длины, а не перегруженную версию функции

Структуры C не имеют конструкторов и не могут наследовать от других структур, они просто удобный способ сгруппированные по адресу переменные

C не является языком объектно-ориентированного программирования и не имеет ни одной функции языка объектно-ориентированного программирования

, заявив, что вы можете имитировать функциональность C ++ с помощью кода C, но с помощью C ++ компилятор выполнит всю работу за вы во время компиляции

2
ответ дан 5 December 2019 в 04:35
поделиться

Все остальное - "легко" подделать :)

2
ответ дан 5 December 2019 в 04:35
поделиться

Какие все концепции присутствуют в C ++ что не может быть реализовано на C?

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

Реальная разница сводится к двум вещам: что компилятор согласится обеспечить, и какие синтаксические удобства предлагает язык.

Что касается принудительного применения компилятора, то в C ++ компилятор не позволит вам напрямую обращаться к частным элементам данных извне класса или друзей класса. В C компилятор этого не требует; вам придется полагаться на документацию API, чтобы отделить «частные» данные от «общедоступных» данных.

Что касается синтаксического удобства, C ++ предлагает всевозможные удобства, которых нет в C, такие как перегрузка операторов, ссылки, автоматическая инициализация и уничтожение объектов (в форме конструкторов / деструкторов), исключения и автоматическая раскрутка стека, встроенная поддержка полиморфизма и т. Д.

Таким образом, любая концепция, выраженная на C ++, может быть выражена на C; это просто вопрос того, как далеко пойдет компилятор, чтобы помочь вам выразить определенную концепцию и насколько синтаксически удобен компилятор. Поскольку C ++ является более новым языком, в нем гораздо больше наворотов, чем в C, что упрощает выражение определенных концепций.

исключения и автоматическая раскрутка стека, встроенная поддержка полиморфизма и т. д.

Таким образом, в принципе, любая концепция, выраженная в C ++, может быть выражена на C; это просто вопрос того, как далеко пойдет компилятор, чтобы помочь вам выразить определенную концепцию и насколько синтаксически удобен компилятор. Поскольку C ++ является более новым языком, в нем гораздо больше наворотов, чем в C, что упрощает выражение определенных концепций.

исключения и автоматическая раскрутка стека, встроенная поддержка полиморфизма и т. д.

Таким образом, в принципе, любая концепция, выраженная в C ++, может быть выражена на C; это просто вопрос того, как далеко пойдет компилятор, чтобы помочь вам выразить определенную концепцию и насколько синтаксически удобен компилятор. Поскольку C ++ является более новым языком, в нем гораздо больше наворотов, чем в C, что упрощает выражение определенных концепций.

2
ответ дан 5 December 2019 в 04:35
поделиться

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

0
ответ дан 5 December 2019 в 04:35
поделиться

Перегрузка функции

0
ответ дан 5 December 2019 в 04:35
поделиться

Цитируя Джоэла , я бы сказал, что мощная «особенность» C ++ - это перегрузка операторов. Для меня это означает наличие языка, который сведет вас с ума, если вы не будете поддерживать свой собственный код. Например,

i = j * 5;

… в C вы знаете, по крайней мере, что j умножается на пять, а результаты хранятся в i.

Но если вы видите тот же фрагмент код на C ++, вы ничего не знаете. Ничего такого. Единственный способ узнать, что действительно происходит в C ++ - это выяснить какие типы я и j, что-то который может быть где-то объявлен совсем другое. Это потому что j может быть типа, в котором есть оператор * перегружен и что-то делает ужасно остроумно, когда пытаешься умножьте это. И я мог бы быть из типа с оператором = перегружен, а типы могут быть несовместимы, поэтому функция автоматического приведения типов может в конечном итоге позвонили. И единственный способ узнать - это не только проверить типа переменных, но чтобы найти код, реализующий этот тип, и Бог поможет тебе, если есть наследство где-то, потому что теперь вам нужно пройти весь путь до класса иерархия в одиночку, пытаясь найти, где этот код на самом деле, и если где-то есть полиморфизм, ты действительно в беде, потому что это не достаточно, чтобы знать, какие типы я и j заявлено, вы должны знать, какой тип они прямо сейчас, что может предполагать проверку произвольной суммы кода, и ты никогда не сможешь быть конечно, если вы искали везде благодаря проблеме остановки (уф!).

Когда вы видите i = j * 5 в C ++, вы действительно по своему усмотрению, детка, и это, на мой взгляд, снижает способность обнаруживать возможные проблемы просто глядя на код.

Но опять же, это особенность. (Я знаю, что буду понижен в моде, но на момент написания только несколько сообщений говорили о недостатках перегрузки операторов)

-3
ответ дан 5 December 2019 в 04:35
поделиться

Таких не должно быть слишком много, потому что ранние компиляторы C ++ действительно создавали исходный код C из исходного кода C ++. По сути, вы можете делать все на Ассемблере, но НЕ ХОТИТЕ этого делать.

-1
ответ дан 5 December 2019 в 04:35
поделиться

Я полагаю, что существует так много пространств имен, шаблонов, которые нельзя реализовать в C.

0
ответ дан 5 December 2019 в 04:35
поделиться