The name of the interface to a class of objects can be used as a type. For example, if an IDL specification includes an interface declaration (described below) for a class (of objects) "C1", then "C1" can be used as a type name within that IDL specification. When used as a type, an interface name indicates a pointer to an object that supports that interface. An interface name can be used as the type of a method argument, as a method return type, or as the type of a member of a constructed type (a struct, union, or enum). In all cases, the use of an interface name implicitly indicates a pointer to an object that supports that interface.
As explained in Using SOM Classes in Client Programs, SOM's C usage bindings for SOM classes also follow this convention. However, within SOM's C++ bindings, the pointer is made explicit, and the use of an interface name as a type refers to a class instance itself, rather than a pointer to a class instance. For example, to declare a variable "myobj" that is a pointer to an instance of class "Foo" in an IDL specification and in a C program, the following declaration is required:
Foo myobj;
However, in a C++ program, the following declaration is required:
Foo *myobj;
If a C programmer uses the SOM Compiler option -maddstar, then the bindings generated for C will also require an explicit '*' in declarations. Thus,
Foo myobj;
This style of bindings for C is permitted for two reasons:
Note: The same C and C++ binding emitters should not be run in the same SOM Compiler command. For example,
sc "-sh;xh" cls.idl // Not valid.
If you wish to generate both C and C++ bindings, you should issue the commands separately:
sc -sh cls.idl sc -sxh cls.idl