Код C еще считается С++?

Комментарий к этому ответу заставил меня задаться вопросом. Я всегда считал, что C является правильным подмножеством С++, то есть любой действительный C-код является допустимым кодом С++ по расширению. Неужели я ошибаюсь? Возможно ли написать действительную C-программу, которая не является допустимым кодом С++?

EDIT: Это действительно похоже на, но не на точный дубликат на этот вопрос.

Ответ 1

В общем, да C-код считается С++-кодом.

Но C не является надлежащим подмножеством в строгом смысле. Есть несколько исключений.

Вот некоторые допустимые вещи в C, которые недопустимы в С++:

int *new;//<-- new is not a keyword in C
char *p = malloc(1024); //void * to char* without cast 

Есть и еще несколько примеров, но вы получаете идею.

Я ранее написал более обширный ответ в аналогичном вопросе здесь.

Ответ 2

Также обратите внимание, что C99 добавляет несколько функций, которые не разрешены в С++ (или поддерживаются только с использованием расширений поставщиков), например, встроенные типы данных _Complex и _Imaginary, массивы переменной длины (массивы, чем время компиляции), гибкие элементы массива (массивы, объявленные как последний элемент структуры, который может содержать неопределенное число элементов) и т.д.

Для исчерпывающего списка несовместимостей между C и С++, включая изменения с C99, см. http://david.tribble.com/text/cdiffs.htm.

Ответ 3

Еще несколько:

C позволяет рекурсивные вызовы main, С++ не

char foo[3] = "abc" является законным C, а не С++

sizeof('A') == sizeof(int) истинно в C и false в С++

Есть еще больше изменений с C99

Изменить: Я нашел сообщение, в котором перечислены большинство различий. http://c-faq.com/misc/cplusplus.nr.html

Резюме о том, почему C не является надлежащим подмножеством С++:

  • автоматическое преобразование из void * в любой объект/неполный тип
  • новые ключевые слова (несколько из них)
  • из-за struct становится видимым
  • из-за тегов struct, становящихся typedef s
  • из-за необходимости создания прототипов
  • неявные int правила
  • Рекурсивный вызов main
  • Из-за // комментариев
  • из-за символьных литералов типа char, а не int и т.д.

Ответ 4

Несколько других вещей, которые действительны C, но не С++:

int func();
func(0,0); //Error in C++, but not in C

Также не стоит недооценивать влияние С++ на большее количество ключевых слов:

int new;  //Obviously an error in C++

Ответ 5

Одна вещь, которая отделяет эти две части и появляется в повседневной разработке, связана с привязкой и названием имени функции. Функция C, скомпилированная с компилятором C, недоступна для С++, если прототип не отмечен extern "C".

Ответ 6

typedef struct {
     int a, b, c;
} st;

st s = {
    .a = 1,
    .b = 2,
};

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

Ответ 7

Я думаю, что правильнее сказать, что ANSI C является подмножеством С++. Не K & R C.

Ответ 8

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