2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C \setminus С++
Сообщение05.09.2012, 18:12 
Заслуженный участник


29/04/12
268
С не является подмножеством С++. Что входит в разность C \ C++?

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение05.09.2012, 18:40 
Заслуженный участник


04/05/09
4582
В C++ отсутствует неявное преобразование void* в другие указатели.
В C++ отсутствует неявное объявление функций.
В C++ нет типа int по умолчанию для функций и переменных.
В C++ нет функций в Kernighan-Ritchie style:
Используется синтаксис C
square(x)
int x;
{
    return x*x;
}
В C++ добавлено много новых ключевых слов, легальное использование которых в C может вызвать ошибки в C++.
В C++ добавлен комментарий //, так что следующий код будет по разному интерпретирован в C и C++:
Код:
i = foo(
        x//**/y
        );
В C и C++ разное значение может иметь sizeof('a').

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение05.09.2012, 19:56 
Заслуженный участник


29/04/12
268
venco в сообщении #615187 писал(а):
В C++ добавлен комментарий //, так что следующий код будет по разному интерпретирован в C и C++:

// есть в C99.

Вопрос возник из следующего. Пускай есть программист на С, но компилятор у него только для С++. Чего он должен избегать, чтобы не попасть в "С, но не С++", при условии, что код компилируется. Под С предполагаем С99.

venco в сообщении #615187 писал(а):
В C и C++ разное значение может иметь sizeof('a').

Вот, я именно о таких случаях спрашиваю. Есть ещё что-то подобное?

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение08.09.2012, 19:06 


21/03/06
1545
Москва
venco писал(а):
В C и C++ разное значение может иметь sizeof('a')

Для одной и той же архитектуры? Что-то я засомневался. Можете подтвердить ссылками на стандарты?

lena7 писал(а):
Пускай есть программист на С, но компилятор у него только для С++. Чего он должен избегать, чтобы не попасть в "С, но не С++", при условии, что код компилируется.

Во-первых, внимательно исследовать все warning'и компилятора и во-вторых, выставить опцию "Use strict K & R syntax" или "disable C++" или что-то типа нее в настройках компилятора, если она есть (в некоторых есть).

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение08.09.2012, 19:52 
Заслуженный участник


04/05/09
4582
e2e4 в сообщении #616273 писал(а):
venco писал(а):
В C и C++ разное значение может иметь sizeof('a')

Для одной и той же архитектуры? Что-то я засомневался. Можете подтвердить ссылками на стандарты?
В C sizeof('a') = sizeof(int), т.к. символьный литерал 'a' имеет тип int.
В C++ sizeof('a') = sizeof(char) = 1.

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение08.09.2012, 20:21 
Заслуженный участник
Аватара пользователя


30/01/06
72407
e2e4 в сообщении #616273 писал(а):
Для одной и той же архитектуры? Что-то я засомневался. Можете подтвердить ссылками на стандарты?

В Си довольно рано было принято, что символьные литералы преобразуются в тип int. Сам язык был тогда молодой, маленький и такая несистематичность не волновала, да и не прочил никто этому языку столь большого будущего, это был сравнительно небольшой проект по системному программированию, как и его языки-предки BCPL и B. Потом это глубоко вросло в стандартные системные функции, например, в соглашения типа того, что getchar() может возвращать EOF==-1, и менять уже было нельзя из-за потери совместимости.

В C++, когда пошли на частичную несовместимость с Си, решились поменять этот момент, поскольку неявных преобразований появилось уже много, и в них надо было наводить порядок. Другой аналогичный момент не поменяли, дробные литералы преобразуются в тип double, а не float. Оба соглашения были закреплены в стандартах обоих языков, и менять их уже никто не собирается. Так что для Си теперь навсегда sizeof('a')==sizeof(int), а для C++ sizeof('a')==sizeof(char).

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение11.10.2012, 11:29 


10/04/12
704
lena7 в сообщении #615218 писал(а):
Вопрос возник из следующего. Пускай есть программист на С, но компилятор у него только для С++. Чего он должен избегать, чтобы не попасть в "С, но не С++", при условии, что код компилируется. Под С предполагаем С99.


Массивы в стеке?

Используется синтаксис C
int f(int n)
{
  int test_array[n];
  // ...
}


restrict-указатели?

Используется синтаксис C
int sumf(int * restrict data)
{
  // ...
}


В этом вопрос?

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение11.10.2012, 20:41 
Заслуженный участник


29/04/12
268
mustitz в сообщении #629454 писал(а):
Массивы в стеке?

В С99 вроде ввели уже.

 Профиль  
                  
 
 Re: C \setminus С++
Сообщение12.10.2012, 11:57 


10/04/12
704
lena7 в сообщении #629661 писал(а):
mustitz в сообщении #629454 писал(а):
Массивы в стеке?

В С99 вроде ввели уже.


Да, они есть в C99, но их нет в C++.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group