Что мешает C ++ быть строгим надмножеством C? [Дубликат]

Возможный дубликат:
«C подмножество C ++» -> Где нет? Примеры ?

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

 JeremyP23 сент. 2010 г., 11:43
@ Matt Joiner: почему отложили C99?
 Konrad Rudolph23 сент. 2010 г., 11:43
@Matt: продемонстрируйте этокакие не возможно? Конечно, каждая программа на C может быть реорганизована на действительный C ++. Это довольно тривиально, учитывая, что оба языка Тьюринга завершены.
 Matt Joiner23 сент. 2010 г., 11:41
На этот вопрос отвечали 1000 раз, я хотел бы увидеть технический ответ, который демонстрирует, что это просто невозможно, кроме ключевых слов и C99 ...
 Steve Jessop23 сент. 2010 г., 12:36
@ Конрад: Это почти что тривиально, но не совсем. C завершена по Тьюрингу и также предоставляет доступ к файловой системе. Его вычислительная модель имеет выходные данные, которые не совпадают с выходными данными модели Тьюринга. Гипотетический язык, который был завершен по Тьюрингу, но не предоставлял доступ к файловой системе, не был бы надмножеством C в смысле «может быть реорганизован». Но потому что C ++ обеспечивает доступ ко всем библиотекам C иvolatile память, мы хорошо выглядим на счет ввода / вывода.

Ответы на вопрос(5)

C ++ также не поддерживает массивы переменной длины, где:

int array[n];

действительно в C, но не в C ++. Версия C ++ выше будет:

int *array = new int[n];
  ...
delete [] array;
 Martin York23 сент. 2010 г., 14:39
То естьНЕ как бы вы сделали это в C ++.
 Steve Jessop23 сент. 2010 г., 12:39
@ notJim: да,array будет размещен в стеке. Еслиn были слишком велики для этого, тогда, если вам повезет, реализация прекращается из-за сигнала (или другого разрешения, управляемого ОС). Если вам не повезло, реализация слепо продолжает уничтожать чужую память. Зависит от ОС / компилятора.
 Andreas Magnusson01 мар. 2011 г., 09:36
@FredOverflow: Да, это идиоматический C ++.
 davidtbernal23 сент. 2010 г., 11:57
Можете ли вы объяснить, почему вы можете сделать первый в C? Было быarray как-то распределяться по стеку, а что еслиn были слишком большими для этого? Я плохо знаю C, и мне любопытно, что именно там происходит.
 fredoverflow23 сент. 2010 г., 11:52
Я бы заменилnew int[] а такжеdelete[] сstd::vector<int>.
 Vijay Mathew23 сент. 2010 г., 11:57
Массивы переменной длины были добавлены в C99.
 Andreas Magnusson23 сент. 2010 г., 11:46
Вы можете уточнить, чтоn является переменной, а не константой, иначе это действительно будет допустимо в C ++.
 basil17 мая 2015 г., 19:03
G ++ позволяет это. Очень хакерский, и использовал его в колледже

Простой пример, рассмотрим это объявление:

int f();

Это допустимый C, но недействительный C ++:f(3, 2, -5, "wtf");

Пояснение: на С,int f() рассматривается какint f(...) (по крайней мере, на первом сайте вызова). Объявить какint f(void) если ты не хочешьf взять параметры.

 Alexandre C.23 сент. 2010 г., 15:11
@tristopia: Что бы это ни было, это действительноне делай этого вещь.
 Patrick Schlüter23 сент. 2010 г., 16:51
Абсолютно, я просто придирчив, потому что есть реальная, но тонкая разница Это сказало, что я не понижал Ваш вклад, поскольку сообщение в основном хорошо.
 Patrick Schlüter23 сент. 2010 г., 15:02
Нет,int f() не совсемint f(...) есть большая семантическая разница. В первом случае это означает, что я не знаю параметров этой функции, и при первом обращении к вызову функции типы по умолчанию, используемые в качестве параметров, объявляют сигнатуру этой функции, последующие вызовы должны соответствовать этому неявному прототипу и Компилятор должен предупредить, если вы вызываете функцию с другими параметрами. С эллипсом это не так, каждый вызов может иметь разные параметры без предупреждения.

Один из моих голов - C ++ не поддерживает int по умолчанию.

 Antti Haapala13 мар. 2016 г., 17:21
Неявный тип возврата также не разрешен в C, кроме как до C99.

Есть специальныйвики запись, которая обобщает много вопросов.

Решение Вопроса

Слон в комнате: следующее действительное C, но не действительное C ++.

int typename = 1;

Замените ваше любимое зарезервированное слово C ++.

 SheetJS31 дек. 2013 г., 19:35
Самый короткий пример будетint new = 1;
 Konrad Rudolph23 сент. 2010 г., 11:47
Почему это было отвергнуто?

Ваш ответ на вопрос