Abstract data types are not restricted to object-oriented languages like such as C++ and Java and . They should be created and used in C language programs as well. Abstract data types are most effective when used with private (opaque) data types and information hiding.
...
This noncompliant code example is based on the managed string library developed by CERT [Burch 2006]. In this example, the managed string type , and the functions that operate on this type , are defined in the string_m.h
header file as follows:
Code Block | ||||
---|---|---|---|---|
| ||||
struct string_mx { size_t size; size_t maxsize; unsigned char strtype; char *cstr; }; typedef struct string_mx string_mx; /* Function declarations */ extern errno_t strcpy_m(string_mx *s1, const string_mx *s2); extern errno_t strcat_m(string_mx *s1, const string_mx *s2); /* etc. */ |
...
In the external string_m.h
file, the string_mx
type is defined to be an instance of struct string_mx
, which in turn is declared as an incomplete type.:
Code Block | ||||
---|---|---|---|---|
| ||||
struct string_mx; typedef struct string_mx string_mx; /* Function declarations */ extern errno_t strcpy_m(string_mx *s1, const string_mx *s2); extern errno_t strcat_m(string_mx *s1, const string_mx *s2); /* etc. */ |
In the internal header file, struct string_mx
is fully defined but not visible to a user of the data abstraction.:
Code Block | ||||
---|---|---|---|---|
| ||||
struct string_mx { size_t size; size_t maxsize; unsigned char strtype; char *cstr; }; |
Modules that implement the abstract data type include both the external and internal definitions, whereas users of the data abstraction include only the external string_m.h
file. This allows the implementation of the string_mx
data type to remain private.
...