Код C по-прежнему считается C ++? - PullRequest
10 голосов
/ 20 ноября 2008

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

РЕДАКТИРОВАТЬ: Это действительно похоже, но не точная копия этот вопрос .

Ответы [ 8 ]

27 голосов
/ 20 ноября 2008

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

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

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

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

Есть и другие примеры, но вы поняли идею.

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

12 голосов
/ 20 ноября 2008

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

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

7 голосов
/ 20 ноября 2008

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

C разрешает рекурсивные вызовы main, C ++ не

char foo[3] = "abc" является допустимым C, а не C ++

sizeof('A') == sizeof(int) верно в C и false в C ++

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

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

Краткое описание того, почему C не является правильным подмножеством C ++:

  1. автоматическое преобразование из void * в любой объект / неполный тип
  2. новые ключевые слова (количество из них)
  3. из-за struct s становится ограниченным
  4. из-за struct тегов становится typedef s
  5. из-за необходимости прототипов
  6. неявные int правила
  7. Рекурсивный вызов main
  8. Из-за // комментариев
  9. из-за символьных литералов типа char, а не int и т. Д.
5 голосов
/ 20 ноября 2008

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

5 голосов
/ 20 ноября 2008

Пара других вещей, которые являются действительными C, но не C ++:

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

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

int new;  //Obviously an error in C++
2 голосов
/ 20 ноября 2008
typedef struct {
     int a, b, c;
} st;

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

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

1 голос
/ 20 ноября 2008

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

1 голос
/ 20 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...