C++/CX
1. 개요
C++/CX는 Windows 런타임을 위한 프로그래밍을 위해 도입된 C++ 언어의 확장이다. C++11 표준과 호환되며, `ref new` 키워드를 사용하여 WinRT 객체를 생성하고, 참조 포인터(`^`)를 사용한다. 클래스 정의를 여러 파일로 분할하는 `partial` 키워드와 런타임 기반 동적 제네릭을 지원하며, 메타데이터를 통해 클래스와 멤버를 노출하여 다른 언어와의 코드 공유를 가능하게 한다. 또한, C++ 표준 라이브러리와 WinRT 기능을 연결하는 런타임 라이브러리를 제공하며, `__cplusplus_winrt` 전처리기 기호를 통해 C++/CX 확장을 감지할 수 있다.
-
C++ 프로그래밍 언어 계열 -
C++/CLI
-
C++ 프로그래밍 언어 계열 -
AspectC++
AspectC++는 C++ 언어에서 AOP를 구현하도록 돕는 프레임워크로서, 조인 포인트 정의 및 조인 포인트 API를 통한 런타임 정보 접근을 제공하여 함수 호출 추적, 로깅, 디버깅 등의 기능을 구현하고 컴파일 시간 유형 정보를 활용해 더욱 강력한 AOP를 지원한다. -
C++ -
헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다. -
C++ -
소멸자 (컴퓨터 프로그래밍)
소멸자는 객체가 메모리에서 제거되기 직전에 호출되는 멤버 함수로, 객체 자원 해제 및 정리 작업을 수행하며, C++ 등 여러 언어에서 구현되고 메모리 누수 방지에 기여한다.
2. 구문 변화
C++/CX는 윈도 런타임 프로그래밍을 위한 구문 확장을 도입했지만, 전반적인 플랫폼 독립적 구문은 C++11 표준과 호환되도록 설계되었다.
2.1. 객체 생성
WinRT 객체는 C++/CLI에서 상속된 `^` (hat) 표기법으로 선언된 변수에 할당되고 `ref new`를 사용하여 생성, 즉 '활성화'된다.
```cpp
Foo^ foo = ref new Foo();
```
WinRT 변수는 가상 메서드 테이블에 대한 포인터와 객체의 내부 데이터에 대한 포인터 쌍이다. WinRT 객체는 참조 계수를 사용하며, 따라서 shared_ptr로 감싼 일반적인 C++ 객체와 유사하게 처리된다. 객체는 해당 객체를 가리키는 참조가 더 이상 없을 때 삭제된다.
가비지 컬렉션은 관여하지 않는다. 그럼에도 불구하고, 키워드 `gcnew`는 미래에 사용될 가능성을 위해 예약되어 있다.
참조 포인터 `^`는 CLI와 같으나 `gcnew`를 사용하지 않고 신규 키워드 `ref new`를 사용한다.
C++/CLI
```cpp
Obj^ obj = gcnew Obj();
```
C++/CX
```cpp
Obj^ obj = ref new Obj();
2.2. 클래스 파일 분리
cpp
// test.internal.h
partial ref class Test
{
private:
int _priv_num;
};
```
```cpp
// test.h
#include "test.internal.h"
ref class Test
{
public:
int GetNumber();
};
```
```cpp
// test.cpp
#include "pch.h"
#include "test.h"
int Test::GetNumber()
{
return _priv_num;
}
```
`partial` 키워드를 사용하여 클래스 정의를 여러 파일로 나눌 수 있다. 이는 코드 구성을 개선하고 대규모 프로젝트 관리에 유용하다.
2.3. 런타임 제네릭
C++/CX는 윈도우 런타임의 런타임 기반 동적 제네릭을 지원한다.
```cpp
generic
public ref class bag
{
property T Item;
};
```
윈도 런타임 및 C++/CX는 런타임 기반 제네릭을 지원한다. 제네릭 형식 정보는 메타데이터에 포함되어 런타임에 인스턴스화된다. 이는 컴파일 시점에 구성되는 C++ 템플릿과는 대조적이다. 이 두 가지는 모두 컴파일러에서 지원하며 결합하여 사용할 수 있다.
3. 메타데이터
모든 WinRT 프로그램은 선언된 클래스와 멤버를 메타데이터를 통해 노출한다. 이 형식은 .NET 프레임워크에서 만들어진 표준인 공용 언어 인프라(CLI)의 일부로 표준화된 것과 동일하다. 이 때문에 C++/CX, CLI 언어, 그리고 윈도우 런타임을 대상으로 하는 JavaScript 간에 코드를 공유할 수 있다.
4. 런타임 라이브러리
C++/CX는 Windows 런타임을 대상으로 하는 일련의 라이브러리를 가지고 있다. 이는 C++ 표준 라이브러리와 WinRT의 기능을 연결하는 데 도움을 준다.
5. 전처리기 기반 감지
`__cplusplus_winrt` 전처리기 기호를 사용하여 C++/CX 확장이 켜져 있는지 확인할 수 있다.
```cpp
#ifdef __cplusplus_winrt
// C++/CX 관련 코드가 여기에 있습니다...
#endif