C implicit extern for global variable, when does it happen, how does it work -
i'm trying understand ways in c global variable can shared between multiple files (compilation units). i've read excellent question , answer here. after doing few tests i'm still left stuff don't get:
basically question be: if there's variable declared (but not defined) in header without extern keyword, ok include header in various compilation units in order make available variable compilation units? in scenario it's implied 1 (and one) compilation unit contains code initializing (defining?) variable, , called first before other compilation units try variable. if true, procedure what's called "implicit extern" ?
i'll illustrate question example:
header "mycommonheader.h" contains:
//mycommonheader.h int* i; //pointer int file myfirstheader.h contains:
//myfirstheader.h void changeit(int newvalue); file myfirstsource.c contains:
//myfirstsource.c #include "myfirstheader.h" void changeit(int newvalue) { *i = newvalue; } file mysecondsource.c contains:
//mysecondsource.c #include "mycommonheader.h" #include "myfirstheader.h" void main() { = malloc(sizeof(int)); changeit(10); *i = 23; } does above code operates same variable everywhere? need add externanywhere?
/* file.h */ int* i; is tentative definition of i variable. means if there no other (external) definition variable in translation unit, defined once (initialized 0). if there 1 matching (external) definition of i elsewhere in translation unit, definition used, , tentative definition above behave declaration.
as common extension, compilers extend behavior across translation units. means, such compilers, can safely include header file in many translation units want, , there still 1 definition of i.
it have been different if had explicitly initialized i in header file :
/* file.h */ int* = 0; this actual definition (not tentative), , can include header file in 1 compilation unit, or you'd multiple definition error.
the better way, define variable in .c file, , use extern in header file :
/* file.h */ extern int* i; /* file.c */ int* = 0; this makes absolutely clear there 1 definition (the 1 in .c file), , every compilation unit header file included refer definition.
Comments
Post a Comment