Is it possible to declare a structure type that is only visible in the .c file which uses the structure? I know that by putting static in front of a external data object, you change the linkage of the variable to be internal. But is it possible to put static in front of the declaration of a new struct type, like the following?
static struct log{
...;
...;
};
typedef struct log log;
If it is not possible to make the structure type, say log as above, to be “private”, does it mean that even though other source files do not know the existence of the name (which is log in my example) of the structure, accidental name collisions can still happen if they name some variables log (assuming I will link all object files) ?
EDIT: I am not familiar with how compiler/linker works. If there is a global variable name log, and the file that contains the global variable is linked to the sole source file in which structure log is defined, wouldn’t that cause any confusion when linking, one log is a variable name while another log is a type name?
No. The only way to make a
structprivate is to only have its definition available in the files that use it — don’t put it in a common header file. If it’s only used in one source file, then just define it in that source file, but if it’s used in more than one source file, you have a tricky problem: you can define it in each source file, but that’s fragile since you have to remember to change each instance of it when you make any changes; or, you can define it in a private header file, and make sure only those source files include the private header.Name collisions in different source files are ok, as long as they don’t try to interface with each other in any way. If you have a
struct logdefined in one file and a different definition ofstruct login a different file, do not ever pass onelogto the other. In C, the structure name doesn’t become part of any symbol names in the object file — in particular, there’s no name mangling of function names to include the parameter types (like C++ does), since function overloading is illegal in C.