I have a CarClass.h file that declares CarClass.
I then #import this CarClass.h file into my CarClass.m file where I of course then go on to implement all my CarClass methods.
Finally, my CarAPP.m file (which contains the main) ALSO #imports CarClass.h – and everything works just fine.
Ss there are actually no problems there 🙂
However, I’m not sure I understand WHY it works – cause the linkage seems a little off: if CarAPP.m imports ONLY the CarClass.h file – without also importing the CarClass.m file, then where does it GET or SEE the implementations from?
Is it the case that once the “.m” file – which imports the “.h” file – is compiled, then the two files (.h and .m) are sorta forever linked or something?
I just don’t get it…
The compiling process is split in different phases, and
#importdirectives are interpreted long before any linkage occurs.When you give code files (.c, .m) to your compiler, it will try to generate a code object file (.o) from it; that is, a binary representation of your code. This file is not yet executable because it needs more information. Especially, it’s not linked to any other file. Header files, supposed to contain only declarations and no definition, typically don’t get their own matching .o file.
After all your code files have been made into code objects, the compiler will put them all together and invoke the linker. The linker will resolve all external references, and then will produce an executable file.
The point is that header files tell the compiler that a function or method exists somewhere. This is enough at the current phase of compilation to produce object files: the compiler just needs to be told what exists, not where’s the definition. Only when you actually link you need to know this.
Since all your code object files get packaged together, your whole program gets access to everything that was publicly declared within itself. This is why you don’t need to explicitly “link” CarAPP.m against CarClass.m.
It’s also possible to mislead the compiler and declare functions in header files that not defined anywhere. If you use them in your program, the first phases of compilation will go just fine (no syntax error, no “undeclared function”) but it will break at link-time, since the linker won’t be able to locate the nonexistent function.