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
4587
В 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
4587
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
705
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
705
lena7 в сообщении #629661 писал(а):
mustitz в сообщении #629454 писал(а):
Массивы в стеке?

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


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

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

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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