C 言語はオブジェクト操作の概念を直接サポートしないため、オブジェクト・モデルから C コードを生成する際に検討しなければならない問題が 2 点あります。
オブジェクトに関連付けられている各操作は C ではグローバル関数として実装されるため、 それが操作されるオブジェクトを指すポインターの形式でコンテキストを指定する必要があります。 C++ では、このコンテキストは、暗黙的な this ポインターの形式で最初の引数として提供されます。 しかし、C では、this ポインターは使用できません。 そこで、C での IBM® Rational® Rhapsody® においては、操作に渡す最初の引数は 一般に、その操作に関連付けられたオブジェクトへのポインターです。 このコンテキスト・ポインターは、通常、me と呼ばれます。例:
/*## operation close() */
void Valve_close(Valve* const me);
シングルトン・オブジェクトのインスタンスは 1 つのみであるため、シングルトン操作ではコンテキスト・ポインターは必要ありません。 詳細については、シングルトン・オブジェクトを参照してください。
最初の引数に生成される名前は、 C_CG::Operation::Me プロパティーおよび C_CG::Operation::MeDeclType プロパティーを使用して変更できます。 Me プロパティーは、最初の引数に使用される文字列 (例えば、「me」) を指定します。 MeDeclType プロパティーは、最初の引数の完全な型宣言を指定します。 そのデフォルト値は、以下のとおりです。
$objectName* const
objectName 変数は、そのオブジェクト・タイプの名前に置き換えられます。 objectName 変数に a :i スイッチを追加すると、名前の切り捨てが行われて大文字のみが残されます。 例えば、HomeHeatingSystem という名前のオブジェクトに $objectName:i を使用すると、 HHS という名前になります。
Rational Rhapsody は、操作用に生成されるコードに me 引数を自動的に挿入しますが、オブジェクトの操作を呼び出すときにそれを指定するのを忘れないようにすることが重要です。
C には、関数用にフラットの名前空間があるため、Rational Rhapsody は、命名規則を使用して名前空間の競合を解決しています。 使用される規則では、各 (パブリック) 操作に、それが作動するオブジェクトの名前を接頭辞として付けます。 (プライベート操作用の異なる命名規則について詳しくは、操作の可視性 を参照してください。)
例えば、Valve オブジェクトには open() と close() の 2 つのパブリック操作があります。 これらの操作は、以下のように実装されます。
void Valve_open(struct Valve_t * const me);
void Valve_close(struct Valve_t * const me);