more_cry
@more_cry
Пишу веб-проекты не до конца

Код C, который не будет работать в C++?

Вырезка из Википедии:

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


И у Лафоре встречал такое заявление, что аки не каждый код на C будет скомпилирован компилятором C++. Спорить-то и нечего, но сколько помню, то все функции языка Си поддерживаются в C++. Обратная совместимость же!

Но можно ли узнать конкретно какой код не скомпилируется?
  • Вопрос задан
  • 2403 просмотра
Решения вопроса 3
Массивы переменной длинны (VLA).

#include "stdio.h"

int main() {
 size_t n;
 scanf("%Iu", n);
 int array[n];
 return 0;
}

Но всё зависит от компилятора и строгости следования стандарту. GNU компилятор, например, вводит такие массивы для C++ в расширениях.

Ещё в C есть restrict переменные, регистровые переменные, которых нет с C++.
Ответ написан
sfi0zy
@sfi0zy
Creative frontend developer
Что характерно, никто даже не вспомнил про различие набора ключевых слов:
int main()
{
    int class = 10;
    return 0;
}

это никак не будет компилироваться как с++, но при этом как чистый си - никаких проблем
Ответ написан
Комментировать
@abcd0x00
int f()
{
    return 1;
}

int main(void)
{
    f(1, 2);
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Rou1997
@Rou1997
Любой будет работать. Я переименую файл с .cpp на .c, и будет работать любой.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Вот пример с двумя файлами, который компилируется и как С и как С++, но линкуется только как С. Различие между языками в наличии в С tentative definition:
Файл a.c:
int i;

int main()
{
    i = 1;
    return 0;
}


файл b.c:
int i;

int f(void)
{
    i = 1;
    return 0;
}


$ gcc -std=c89 a.c b.c -o a
$ gcc -std=c99 a.c b.c -o a
$ gcc -std=c11 a.c b.c -o a
$ g++ a.c b.c -o a
/tmp/cc8AfU2T.o:(.bss+0x0): multiple definition of `i'
/tmp/ccBOJ29v.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Ответ написан
Комментировать
rhaport
@rhaport
typdef enum
{
  zero,
  one,
  two
} t_numbers;

int main()
{
   t_numbers x;
   x = 2;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы