Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 04.12.2008, 17:13   #1
Заблокирован
 Старший сержант
Аватар для shagart
 
shagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слуху
Регистрация: 16.07.2008
Сообщений: 209
Популярность: 1335
Сказал(а) спасибо: 231
Поблагодарили 236 раз(а) в 134 сообщениях
Отправить сообщение для shagart с помощью ICQ Отправить сообщение для shagart с помощью Telegram Отправить сообщение для shagart с помощью Yahoo Отправить сообщение для shagart с помощью Skype™
 
По умолчанию Преобразования: С-С++

Преобразование программ, написанных на языке С, в программы на С++.

Если у вас имеется собственная программа на языке С, возможно она же будет вашей первой программой на С++! Кроме некоторых исключений, язык С является своеобразным подмножеством С++, т.е. С++ поддерживает почти все компоненты С++, дополняя их многими собственными компонентами. Следовательно, начиная работать с С++, можно компилировать программы на С, как и на С++ с помощью компилятора С++ вместо С. Затем можено постепенно добавлять в программы различные компоненты, характерные для С++.

Чтобы использовать компилятор С++, нужно присвоить исходному файлу имя с расширением .cpp или .cxx вместо .с. Однако существуют приёмы программирования, допустимые во многих версиях С, которые не будут компилироваться с помощью С++ или будут компилироваться с изменением смысловых значений. Далее описаны некоторые наиболее важные конструкции языка С, которые не поддерживаются в С++.

В языке С++ намного больше зарезервированных ключевых слов, чем в С. В программах их нельзя использовать как идентификаторы. Ниже приведён список зарезервированных ключевых слов, который содержит ключевые слова языка С и дополнительные ключевые слова, существующие только в С++.
Код:
auto
bad_cast
bad_typeid
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast	else
enum
except
explicit
extern
false
finally
float
for
friend
goto
if
inline
int
long
mutable
namespace	new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
stuct
switch
template
this	throw
true
try
type_info
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
while
В языке С разрешен вызов функции перед её объявлением или определением (в этом случае генерируется предупреждение). Теперь в С++ определение или объявление функции должно предшествовать любому вызову функции внутри исходного файла (в противном случае компилятор сгенерирует ошибку "необъявленный идентификатор").


В языке С можно объявить функцию, использующую один или более параметров, предварительно их не перечисляя, например:
int FuncX (); /* эта функция языка С на самом деле будет использовать
несколько параметров */

Однако в языке С++ такое объявление допустимо только для функций, которые не имеют параметров.

В языке С можно использовать "старый стиль" синтаксиса определения функции, в котором типы параметров следуют за списком параметров, например:
Код:
int FuncX (A, B); /* правильно в С, ошибка в С++ */
int A;
int B;
{
/* код FuncX */
return 0;
}
В языке С++ использование такого стиля недопустимо.

В некоторых версиях С глобальный объект данных глобальный объект данных можно объявить в программе более одного раза без использования спецификатора extern. В языке С++ для определения переменной можно объявить глобальный объект данных без спецификатора extern только один раз. Чтобы сделать переменную доступной в определённой области видимости, все другие объявления элемента должны включать ключевое слово extern. (Термин область видимости указывает на фрагмент текста программы, в котором используется определённое имя.)

В языке С (в соответствиисо стандартом ANSI) можно присвоить указатель типа void указателю любого типа. Например, следующий код задаёт присваивание указателя типа int указателю типа void:
Код:
/* этот код правильный в С, но ошибочный в С++ */
typedef int TypeA;
struct TypeA
{
 int I;
 char C;
 double D;
 };
typedef int TpeB;
union TypeB
 {
 int I;
 char C;
 double D;
 };
typedef int TypeC;
enum TypeC (Red, Green, Blue);
В языке С++ присваивание PInt генерирует ошибку, потому что компилятор С++ не будет автоматически преобразовывать указатель типа void в указатель другого типа в выражении присваивания. Для выполнения присваивания используется операция изменения типа.
Код:
PInt = (int *)PVoid; /* правильно в С и С++ */
В языке С названия тегов конструкций enum, struct или union могут совпадать с названиями типов данных, определёнными оператором typedef, в пределах одной области видимости. Например, следующий код успешно компилируется в С:
/* этот код правильный в С, но ошибочный в С++ */
Код:
typedef int TypeA;
struct TypeA
{
 int I;
 char C;
 double D;
 };
typedef int TpeB;
union TypeB
 {
 int I;
 char C;
 double D;
 };
typedef int TypeC;
enum TypeC (Red, Green, Blue);
Компилятор языка С может различать дублирующие имена, потому что при описании перечислений, структур и объединений используются префиксы enum, struct или union, например:
Код:
/* этот код правилен в С, но ошибочен в С++: */
typedef int TypeA;
struct TypeA
 {
 int I;
 char C;
 double D;
 };
TypeA X;/* создаёт переменную типа int */
struct TypeA Y;/* создаёт структуру TypeA */
sizeof (TypeA);/* вычисляет размер переменной типа int */
sizeof (struct TupeA);/* вычисляет размер структуры TypeA */
В языке С++ теги конструкций enum, struct, union и class (в С++ их чаще называют именами, а не тегами) должны отличаться от любого имени, заданного в операторе typedef внутри той же области видимости. (Ключевое слово class уникально для языка С++.) Определение создаёт новый тип, на который можно сослаться, используя одно имя этого типа, поэтому не рекомендуется использовать префикс enum, struct, union и class (хотя при желании это можно делать). Описанное свойство продемонстрировано следующим фрагментом программы:
Код:
/* этот код ошибочен в С, но правилен в С++ */
struct TypeA
 {
 int I;
 char C;
 double D;
 };
struct TypeA X;/* создаёт структуру TypeA */
TypeA Y;/* также создаёт структуру TypeA */
sizeof (struct TypeA);/* вычисляет размер структуры TypeAyields */
sizeof (TypeA);/* вычисляет размер структуры TypeA */
Следовательно, если задать оператор typedef с таким же именем, то компилятор С++ не всегда сможет различить эти два типа, например:
Код:
typedef int TypeA
struct TypeA/* ошибка в С++: повторное определение TypeA */
 {
 int I;
 char C;
 double D;
 };
TypeA X;/* создаются при этом данные типа int или структура TypeA? */
sizeof (TypeA); /* вычисляется размер данных типа int или размер структуры TypeA ? */
Ещё одна несвместимость связана с предыдущей: в языке С, если теги enum, struct или union такие же, как имя, определённое typedef во внешней области видимости, то вы всё ещё можете оставить ссылку на typedef во внутренней области видимости (т.е. имя, определённое typedef, не скрыто). Однако в языке С++ имя typedef должно быть скрыто. Следующий фрагмент программы иллюстрирует различие:
Код:
typedef int TypeA;
void main ()
 {
 struct TypeA
     {
        int I;
        char C;
        double D;
        };
 TypeA X;        /* в языке С идентификатор Х имеет тип int;
                    в С++ Х - это структура TypeA */
 sizeof (TypeA); /* в С - вычисляет размер данных типа int;
                    в С++ - вычисляет размер структуры TypeA */
}
В способах вычисления значений, возвращаемых оператором sizeof, есть два дополнительных различия. Первое: в языке С sizeof ('x') равно sizeof (int), а в С++ оно равно sizeof (char). Далее, предположим, что определено перечисление
enum E {X, Y, Z};

Тогда (второе различие) в С значение sizeof (X) будет равно sizeof (int), а в С++ равно sizeof (E), что не обязательно равно sizeof (int).
Работа с несовместимыми конструкциями.

Из существующей программы на С можно удалить любую из несовместимых с С++ конструкций так, что код будет компилироваться и иметь такое же смысловое содержание, как и при использовании компилятора С++. Компилятор С++ заметит все перечисленные варианты несовместимости, кроме двух последних, которые (особенно различия в значениях, создаваемых оператором sizeof) не приводят к сообщению компилятора об ошибке, но изменяют смысловое содержание программы. Такая ситуация - исключение из общего правила: если программа успешно компилируется компиляторами С и С++, то она имеет одинаковое смысловое содержание в обоих языках.

Выписка их книги по С++.
  Ответить с цитированием
Пользователь сказал cпасибо:
Ivan_32 (04.12.2008)
Старый 04.12.2008, 17:41   #2
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Вот из за это дурацкого ООП и всякой гадости С++ и стал таким глюкнутым. Разработчики попытались ввести строгую типизацию ну и естественно это у них не получилось, всмысле если бы и получилось то это уже был бы не С++ а что ни будь другое. С++ по ожиданиям должен был стать хорошей заменой ассемблеру, а в результате стал многообластным язык, финансы наука итд. А С то был заменой асму...

Вот например эта строка в MSVC++ компилируется через раз:
int a(){};
DWORD b=&a;
а в любом компиляторе С без проблем... все из за этих нововведений.
  Ответить с цитированием
Старый 13.01.2010, 21:15   #3
Заблокирован
 Рыцарь
Аватар для HellFire
 
HellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражанияHellFire блестящий пример для подражания
Регистрация: 15.06.2009
Сообщений: 353
Популярность: 1893
Сказал(а) спасибо: 582
Поблагодарили 833 раз(а) в 386 сообщениях
 
По умолчанию Re: Преобразования: С-С++

Цитата:
Сообщение от shagartПосмотреть сообщение

Если у вас имеется собственная программа на языке С, возможно она же будет вашей первой программой на С++! Кроме некоторых исключений, язык С является своеобразным подмножеством С++, т.е. С++ поддерживает почти все компоненты С++

извените за некропост, да ещё и такой древний, но точто зелёным цветом выделено должно быть
Код:
С++ поддерживает почти все компоненты С
?
  Ответить с цитированием
Ответ

Метки
преобразования:, с-с++


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:38.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net