Jump to content

С++/CLI

(Перенаправлено с ECMA-372 )
С++/CLI
Парадигма Структурированный , императивный , объектно-ориентированный
Семья С
Разработано Майкрософт
Разработчик Майкрософт
Впервые появился 2005 г .; 19 лет назад ( 2005 )
Платформа Общая языковая инфраструктура
Веб-сайт документы .microsoft /en-нас /cpp /дотнет /dotnet-programming-with-cpp-cli-visual-cpp
Под влиянием
C++ , Управляемые расширения для C++ , C#

C++/CLI — это вариант C++ языка программирования , модифицированный для Common Language Infrastructure . Он был частью Visual Studio 2005 и более поздних версий и обеспечивает совместимость с другими языками .NET, такими как C# . Microsoft создала C++/CLI, чтобы заменить управляемые расширения для C++ . В декабре 2005 года Ecma International опубликовала спецификации C++/CLI как стандарт ECMA-372 . [1]

Изменения синтаксиса

[ редактировать ]

C++/CLI следует рассматривать как отдельный язык (например, с новым набором ключевых слов), а не как управляемый C++, ориентированный на надмножество C++ (MC++) (чьи нестандартные ключевые слова были стилизованы как __gc или __value). По этой причине произошли некоторые серьезные синтаксические изменения, особенно связанные с устранением неоднозначных идентификаторов и добавлением функций, специфичных для .NET.

Множество конфликтующих синтаксисов, например, несколько версий оператора new() в MC++ разделены: в C++/CLI ссылочные типы .NET создаются с помощью нового ключевого слова gcnew (т.е. сбор мусора new()). Кроме того, в C++/CLI введена концепция обобщений из .NET (для наиболее распространенных целей аналогичных стандартным шаблонам C++, но совершенно отличающихся по своей реализации).

В MC++ существовало два разных типа указателей : __nogc указатели были обычными указателями C++, а __gc указатели работали с ссылочными типами .NET. Однако в C++/CLI единственным типом указателя является обычный указатель C++, тогда как доступ к ссылочным типам .NET осуществляется через «дескриптор» с новым синтаксисом. ClassName^ (вместо ClassName*). Эта новая конструкция особенно полезна при смешивании управляемого и стандартного кода C++; он уточняет, какие объекты подлежат автоматической сборке мусора .NET, а какие объекты программист должен не забыть явно уничтожить.

Отслеживание ссылок

[ редактировать ]

Ссылка отслеживания в C++/CLI — это дескриптор переменной, передаваемой по ссылке. По своей концепции это похоже на использование *& (ссылка на указатель) в стандарте C++ и (в объявлениях функций) соответствует ref ключевое слово, применяемое к типам в C#, или ByRef в Visual Basic .NET . C++/CLI использует ^% синтаксис для указания ссылки отслеживания на дескриптор.

В следующем коде показан пример использования ссылок отслеживания. Замена ссылки отслеживания на обычную переменную-дескриптор оставит в результирующем массиве строк 10 неинициализированных дескрипторов строк, поскольку в массиве будут установлены только копии дескрипторов строк, поскольку они передаются по значению, а не по ссылке.

int   main  ()  {      array  <  String  ^>   ^  arr   =   gcnew   array  <  String  ^>  (  10  );      интервал   я   =   0  ;      для   каждого  (  String  ^%   s   в   arr  )   {          s   =   i  ++  .  ТоСтрока  ();      }      вернуть   0  ;  } 

Обратите внимание, что это было бы незаконно в C#, который не позволяет foreach циклы для передачи значений по ссылке. Следовательно, потребуется обходной путь.

Финализаторы и автоматические переменные

[ редактировать ]

Еще одно изменение в C++/CLI — введение финализатора . синтаксиса !ClassName(), особый тип недетерминированного деструктора, который запускается как часть процедуры сборки мусора . Синтаксис деструктора C++ ~ClassName() также существует для управляемых объектов и лучше отражает «традиционную» семантику C++ детерминированного разрушения (то есть деструкторы, которые могут вызываться из пользовательского кода с помощью delete).

В «сырой» парадигме .NET недетерминированная модель уничтожения переопределяет защищенную модель. Finalize метод корня Object класс, а детерминированная модель реализуется через IDisposable интерфейса метод Dispose (в который компилятор C++/CLI превращает деструктор). Объекты из кода C# или VB.NET, которые переопределяют метод Dispose, можно удалить вручную в C++/CLI с помощью delete точно так же, как это могут делать классы .NET в C++/CLI.

// C++/CLI  ref   class   MyClass  {  public  :      MyClass  ();    // конструктор      ~  MyClass  ();   // (детерминированный) деструктор (реализованный как IDisposable.Dispose())  protected  :      !  МойКласс  ();   // финализатор (недетерминированный деструктор) (реализован как Finalize())  public  :      static   void   Test  ()      {          MyClass   auto  ;   // Не дескриптор, не инициализация: здесь компилятор вызывает конструктор           MyClass   ^  user   =   gcnew   MyClass  ();          удалить   пользователя  ;          // Компилятор вызывает деструктор auto, когда auto выходит за пределы области видимости      }  }; 

Перегрузка оператора

[ редактировать ]

Перегрузка операторов работает аналогично стандартному C++. Каждый * становится ^, каждый & становится %, но остальная часть синтаксиса не меняется, за исключением важного дополнения: для классов .NET перегрузка операторов возможна не только для самих классов, но и для ссылок на эти классы. Эта функция необходима для того, чтобы придать ссылочному классу семантику перегрузки операторов, ожидаемую от ссылочных классов .NET. (Наоборот, это также означает, что для ссылочных классов .NET Framework перегрузка ссылочного оператора часто неявно реализуется в C++/CLI.)

Например, сравнение двух различных ссылок на строки (String^) с помощью оператора == даст значение true, если две строки равны. Однако перегрузка операторов является статической. Таким образом, приведение к Object^ удалит семантику перегрузки.

//эффекты перегрузки ссылочного оператора  String   ^  s1   =   "abc"  ;  Строка   ^  s2   =   «ab»   +   «c»  ;  Объект   ^  o1   =   s1  ;  Объект   ^  о2   =   s2  ;  с1   ==   с2  ;   // правда  o1   ==   o2  ;   // ЛОЖЬ 

Совместимость

[ редактировать ]

C++/CLI позволяет программам C++ использовать программы C# в библиотеках C# DLL. [2] Здесь ключевое слово #using указывает компилятору, где находится DLL для ее метаданных компиляции. Этот простой пример не требует маршаллинга данных .

#include   "stdafx.h"  с использованием   пространства имен   System  ;  #using "...MyCS.dll"  int   main  (  array  <  System  ::  String   ^>   ^  args  )   {      double   x   =   MyCS  ::  Class1  ::  add  (  40.1  ,   1.9  );      вернуть   0  ;  } 

Содержимое исходного кода C# MyCS.dll.

пространство имен   MyCS  ;  общественный   класс   Class1   {      public   static   double   add  (  double   a  ,   double   b  )   {          return   a   +   b  ;      }  } 

В этом примере показано, как строки маршалируются из строк C++ в строки, вызываемые из C#, а затем обратно в строки C++. Маршалинг строк копирует содержимое строки в формы, которые можно использовать в различных средах.

#include   <string>  #include   <iostream>  #include   <msclr\marshal_cppstd.h>  #include   "stdafx.h"  с использованием   пространства имен   System  ;  #using "..MyCS.dll"  int   main  ()   { 	 std  ::  string   s   =   "Я кот"  ; 	 Система  ::  String  ^   clrString   =   msclr  ::  interop  ::  marshal_as  <  System  ::  String  ^>  (  s  );   // строка, которую можно использовать из C# 	 System  ::  String  ^   t   =   MyCS  ::  Class1  ::  process  (  clrString  );   // вызов функции C# 	 std  ::  string   cppString   =   msclr  ::  interop  ::  marshal_as  <  std  ::  string  >  (  t  );   // строка, которую можно использовать из C++ 	 std  ::  cout   <<   "Привет, C++/C# Interop!"   <<   std  ::  endl  ; 	 std  ::  cout   <<   cppString   <<   std  ::  endl  ; 	 вернуть   0  ;  } 

Код C# никоим образом не поддерживает C++.

пространство имен   MyCS  ;  общественный   класс   Class1   {      публичный   статический   строковый   процесс  (  строка   a  )   {          return   a  .  Заменить  (  «кошка»  ,   «собака»  )   +   «с хвостом»  ;      }  } 

Совместимость C++/C# обеспечивает упрощенный доступ C++ ко всему миру функций .NET.

C++/CX, ориентированный на WinRT , хотя и создает полностью неуправляемый код, заимствует синтаксис ref и ^ для компонентов WinRT с подсчетом ссылок, которые похожи на COM . «объекты» [3]

  1. ^ «ЭКМА-372» . ecma-international.org . Экма Интернешнл . Декабрь 2005 г. Архивировано из оригинала 10 августа 2008 г.
  2. ^ Использование взаимодействия с C++ (неявный PInvoke)
  3. ^ Внутри C++/CX Design — Блог группы Visual C++ — Домашняя страница сайта — Блоги MSDN

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6b2f71930bc5b56d27d7fa798e440112__1701608700
URL1:https://arc.ask3.ru/arc/aa/6b/12/6b2f71930bc5b56d27d7fa798e440112.html
Заголовок, (Title) документа по адресу, URL1:
C++/CLI - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)