Код 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 и С++, но отличаются друг от друга.