I’m making progress but without really understanding the big picture for now.
When you build a C project does it look for the header files first and then find a matching definition in a C file, then linking and compiling based on that?
I did an experiment where I changed the name of the .c file and it worked fine regardless of the name. So is it the header file name that matters the most?
I’m learning as I go so I apologize if I should have read this in a book or manual somewhere. If there is a helpful resource I would appreciate a link to it please. :)
@derickflorian Frequently C projects with more than one file are managed by a Makefile. You define the rules by which your project gets built based on what files depend on what other files to compile. When you run the make command, it will comprehend the dependencies, check the file time stamps, and figure out the minimum amount of work to build the project. There are also newer technologies that have developed, see CMake, ninja, tup and others as well as Visual Studio.
@PHolder Thanks for the link to the book and the explanation. I guess my IDE is generating a makefile for me so that explains a lot. I will look at CMake because I think that is the one I’ve heard about most and the K & R book.
I appreciate the explanation. I wasn’t fully appreciating what was going on below the surface. Thank you!
@derickflorian Been a long time since I've worked in C, but if I recall correctly, it processes all of the header files first, using them to build a map of functions and variables and classes that can be invoked (and which external libraries they require).
Then, it compiles the actual code files down into machine-readable binary code.
Then, the linker goes through and actually links that map from the headers with the built code (and any included libraries).
So, yes, the names of the c files don't matter that much. The names of the header files matter, primarily for include purposes.
In C++, the names of the cpp files matter more from a style perspective because the classes are more self-contained and should generally be in matching code/header files.
@LouisIngenthron Thank you, that is really helpful. It makes sense but I didn’t realize the linker came at the end. That explains why it wasn’t generating a map file when I had a compilation error.
The header file thing is interesting to me too. So if I include a header and the function is defined elsewhere it while find the function definition and paste or link it into the file that calls that function?
Thank you for responding and taking the time to explain how this works. I was at the point where I didn’t even really know where to start looking.
@derickflorian "So if I include a header and the function is defined elsewhere it while find the function definition and paste or link it into the file that calls that function?"
Essentially, yes. "Paste" in the case of inline functions and "link" in every other case.
@derickflorian It first looks for the .c files, the job of the .h files is to just let the compiler know what functions or types the code previously parsed is talking about.
@xddz Ok, thank you! I think my IDE too was set up to look in my project directory for the .c files which explained the “magic” of it picking up the files.
@derickflorian Happy to help!
@derickflorian You could never go wrong with the official book written by the authors of the language (make sure you get the ANSI version) https://en.wikipedia.org/wiki/The_C_Programming_Language It's very succinct so may not be an ideal guided learning, but is very handy for reference.
In answer to your question, the .C files have a #include for any header files, whether system provided, or created by you. The rules for finding the files differ if the filename is in angle <> brackets or in quotes.