Термин
managed переводится на русский язык как управляемый. При использовании этого термина с языком программирования C++ обычно имеется в виду применение C++ в среде
.Net Framework. Однако следует знать, что
Managed C++ и
managed C++ - это два различных понятия.
managed C++ - это просто указание на то, что язык
C++ используется в среде
.Net Framework, в то время как
Managed C++ - это конкретная спецификация языка
C++ для использования его в среде
.Net Framework. Причем в настоящее время этот язык, то есть
Managed C++, вышел из употребления, и
Microsoft заменила его новой спецификацией, имеющей название
C++/CLI.
Это не просто некоторая косметическая модификация спецификации
C++ и смена названий для среды
.Net Framework, а, по существу, описание нового языка с новыми ключевыми словами.
Увидеть эти существенные различия и сравнить отличия между
Managed C++ и
C++/CLI можно на примере простой программы. В нижеприведенной программе описан интерфейс с двумя методами и создается иерархия из двух классов, которые наследуют этот интерфейс: абстрактный класс Vehicle и производный от него класс Car.
У меня не было возможности скомпилировать код программы, написанном на основе
Managed C++, так как, как я уже сказал, этот язык в настоящее время не поддерживается
Microsoft. Тем не менее, я надеюсь, что код должен успешно компилироваться, если вы используете более ранние компиляторы
MS VC.
Итак, как говорится, почувствуйте разницу!
Managed C++
#using <mscorlib.dll>
using namespace System;
namespace Lang
{
__gc __interface ISteering
{
void TurnLeft();
void TurnRight();
};
__gc class Vehicle abstract : public ISteering
{
public:
void TurnLeft()
{
Console::WriteLine( "Vehicle turns left." );
}
void TurnRight()
{
Console::WriteLine( "Vehicle turns right." );
}
virtual void ApplyBrakes() = 0;
};
__gc class Car : public Vehicle
{
public:
void ApplyBrakes()
{
Console::WriteLine( "Car trying to stop." );
throw new Exception( "Brake failure!" );
}
};
}
void main()
{
try
{
Lang::Vehicle *v = new Lang::Car();
v->TurnLeft();
v->ApplyBrakes();
}
catch ( Exception *e )
{
Console::WriteLine( e->Message );
}
}
C++/CLI
#include "stdafx.h"
using namespace System;
namespace Lang
{
interface class ISteering
{
void TurnLeft();
void TurnRight();
};
ref class Vehicle abstract : ISteering
{
public:
virtual void TurnLeft()
{
Console::WriteLine( "Vehicle turns left." );
}
virtual void TurnRight()
{
Console::WriteLine( "Vehicle turns right." );
}
virtual void ApplyBrakes() = 0;
};
ref class Car : Vehicle
{
public:
virtual void ApplyBrakes() override
{
Console::WriteLine( "Car trying to stop." );
throw gcnew Exception( "Brake failure!" );
}
};
}
int main()
{
try
{
Lang::Vehicle ^v = gcnew Lang::Car();
v->TurnLeft();
v->ApplyBrakes();
}
catch ( Exception ^e )
{
Console::WriteLine( e->Message );
}
return 0;
}
Код на
C++/CLI был скомпилирован с использованием
MS VS 2010.
Обратите внимание на частое использование двух знаков подчеркивания в ключевых словах Managed C++. Это одна из причин того, что спецификация
managed C++ была переписана
Microsoft, так как программистов раздражали ключевые слова с двумя начальными знаками подчеркивания, а потому
Managed C++ не имел большой популярности.
В программе, написанной на
Managed C++, функция
main объявлена с типом возвращаемого значения
void. В
C# такое объявление
main допускается. Поэтому и в
Managed C++ также использовалось такое объявление
main.
C++/CLI более строго соответствует стандарту
C++, а потому функция
main в программах, написанных на
C++/CLI, должна иметь тип возвращаемого значения
int, хотя предложение с
return 0; можно не писать, как это допускается в стандартном
C++.
Используемая здесь демонстрационная программа написана мною на основе примера кода на
Managed C++, взятого мною из книги Thuan Kai, Hoang Lain ".NET Framework Essentials", Second Edition.