In C, how come function may have several declarations but only one definition? -
in c, how come function may have several declarations 1 definition? can elaborate on please!
in order allow multiple definitions, must require definition functionally identical - otherwise must have way decide run, @ point might give them different names.
proving 2 function definitions identical non-trivial problem. since functions may declared in multiple translation units, need compare them @ link stage in order prove identical. problem when start dealing compiler optimizations may take account other contents of these translation units. example, consider:
const char *foo() { return "world"; }
simple enough, right? compile 2 files. a.c
contains foo
. b.c
contains well:
const char *bar() { return "hello world"; }
the compiler may choose make foo()
's "world" point middle of bar()
's "hello world". linker must somehow determine 2 foo()
s identical, though point non-identical constant data.
a bigger issue comes in when aliasing rules considered. consider:
void frob(int *p); int foo() { int x = 1; x++; frob(&x); }
compiled alone, might result in assembly code similar to:
foo: sub %esp, 4 ; allocate stack space x mov dword [%esp], 2 ; set x 2 (x++ combined initialization) push %esp ; push %x stack frob's argument call frob mov %eax, dword [%esp+4] ; load value of x eax return value add %esp, 8 ; clear stack of frob's argument , x ret ; return
now let's compile definition of frob
in scope:
void frob(int *p) { /* no-op */ }
now have:
frob: ret ; return foo: mov %eax, 2 ; return value = 2 ret ; return
how can linker tell 2 foo
definitions identical?
given difficulties of proving function bodies identical, c opts forbid defining same function twice. c++ uses different approach inline , template functions; doesn't check, , assumes they're identical.
as declarations on other hand, there defined rules proving compatibility, there's no problem in allowing multiple compatible declarations.
Comments
Post a Comment