When the application is linked, all calls to external functions are resolved by the linker and built into an exe or dll (.so on Linux).
Because file_b might include file_a and both include file_d, it's important to protect against this by using the #ifndef directive to check that file_d is only included once. So the 'include for file_d should be wrapped inside a #ifndef ... #endif and these four lines should be in both file_a and file_b.
If the pre-processor includes file_a first then the FILE_D will not exist and so it will be defined and file_d.h will be included. Next when file_b is processed, FILE_D will exist and so file_d.h will not be included for a second time.