It may be helpful to think of the programming process as consisting of a sequence of steps:
- edit-time (when you use an editor to write the source code)
- compile-time (when the tool-chain compiles source code into object code)
- link-time (when the tool-chain links object code into executable code)
- execution-time (when the program actually executes)
(This is only a partial list of the steps.)
Some editors allow you to mechanize part of the editing process (through macros, regular expression substitution, cut and paste, etc.). These mechanizations can be interpreted as small standalone programs that execute during
edit-time to alter/create the C source code.
C macros can similarly be thought of as small standalone programs that execute during
compile-time to alter/create the C source code. Actually, the macros execute (or "expand") during preprocess-time which is just prior to compile-time, but that distinction can be deferred.
Finally, your program does its thing during
execution-time.
By the way, each step can produce error messages. It is much easier to interpret the error message when you take into account which step generated it.