INF: Communal Data Is Not Included in the LIB Listing

ID Number: Q79857

3.11 3.17 3.18 | 3.11 3.17 3.18

MS-DOS | OS/2

Summary:

Communal data declarations generate no PUBLIC definitions. Therefore,

although they can be placed in a library, they are not placed in the

library dictionary and will not be a part of the library listing

generated by the LIB utility.

More Information:

Communal variables are supported only by QuickC, Microsoft C versions

5.0 and later, and MASM. They are, however, similar to common blocks

in FORTRAN. In C, communal variables are the uninitialized global data

items. In MASM, they are data items declared with the COMM qualifier.

The linker will assume the communal variables refer to an external

defining declaration elsewhere. If there is no external definition,

the linker allocates storage and initializes it to 0 (zero). If there

is more than one declaration, storage is allocated for the largest

data item declared. For example, if I is declared int I; in one module

and char I; in another module, the linker will allocate 2 bytes for I

because the int is 2 bytes but the char is only 1 byte. Because memory

for communal variables may not be assigned until load time, their use

may reduce the size of your executable file.

When a communal variable is declared in a library and defined in one

of the object modules, references to that variable will be resolved

with the defined variable. For this reason, communal variable

declarations are not recommended for any file that might be placed in

a library. If a variable defined in a .OBJ file accidentally had the

same name as a communal variable in a library that it is being linked

with, its value would unexplainably change every time you called a

library function that used that communal variable! The linker does not

issue a warning because the variable was defined only once, in the OBJ

file.

In addition, a communal data item X in a library cannot be used to

resolve an external reference to X in a module linked with that

library. For example, linking the following:

C FileModule in Library

-----------------------

extern int X; int X;

void main(void)

{

X = 5;

}

would still result in the error:

L2029 'X': unresolved external

Additional reference words: 3.11 3.17 3.18