C 언어는 오브젝트 오퍼레이션의 개념을 직접 지원하지 않으므로, 오브젝트 모델에서 C 코드를 생성할 때 처리해야 하는 두 가지 문제가 있습니다.
오브젝트와 연관되는 각 오퍼레이션은 C에서 글로벌 함수로 구현되므로, 오퍼레이션이 작동하는 오브젝트에 대한 포인터 양식으로 컨텍스트와 함께 제공해야 합니다. C++에서 이 컨텍스트는 내재된 this 포인터 양식으로 첫 번째 인수로서 제공됩니다. 그러나 C에서는 this 포인터를 사용할 수 없습니다. 따라서 C로 된 IBM® Rational® Rhapsody®에서는 오퍼레이션에 대한 첫 번째 인수가 일반적으로 오퍼레이션과 연관되는 오브젝트에 대한 포인터입니다. 이 컨텍스트 포인터를 보통 me라고 합니다. 예를 들면, 다음과 같습니다.
/*## operation close() */ void Valve_close(Valve* const me);
단 하나의 싱글톤 오브젝트 인스턴스가 있으므로 싱글톤 오퍼레이션에 대해 컨텍스트 포인터가 필요하지 않습니다. 자세한 정보는 싱글톤 오브젝트의 내용을 참조하십시오.
C_CG::Operation::Me 및 C_CG::Operation::MeDeclType 특성을 사용하여 첫 번째 인수에 대해 생성되는 이름을 변경할 수 있습니다. Me 특성은 첫 번째 인수에 사용되는 문자열(예: "me")을 지정합니다. MeDeclType 특성은 첫 번째 인수에 대한 전체 유형 선언을 지정합니다. 해당 기본값은 다음과 같습니다.
$objectName* const
objectName 변수는 오브젝트 유형의 이름으로 바뀝니다. a :i 스위치를 objectName 변수에 추가하면 대문자만 남도록 이름은 잘립니다. 예를 들어, 이름이 HomeHeatingSystem인 오브젝트에 대해 $objectName:i를 사용하면 이름은 HHS가 됩니다.
Rational Rhapsody는 오퍼레이션에 대해 생성된 코드에 자동으로 me 인수를 삽입합니다.
C에는 함수에 대한 일반 네임스페이스가 있으므로, Rational Rhapsody는 네임스페이스 경합을 해결하기 위해 이름 지정 규칙을 사용합니다. 사용되는 규칙은 각 (public) 오퍼레이션에 오퍼레이션이 작동하는 오브젝트의 이름으로 접두부를 붙이는 것입니다. (private 오퍼레이션에 대한 다른 이름 지정 규칙에 대해서는 오퍼레이션의 가시성의 내용을 참조하십시오.)
예를 들어, Valve 오브젝트에는 두 개의 public 오퍼레이션인 open() 및 close()가 있습니다. 이 오퍼레이션은 다음과 같이 구현됩니다.
void Valve_open(struct Valve_t * const me); void Valve_close(struct Valve_t * const me);