Lets say we have the following files :- add.h ``` int add(int x, int y); // function declaration includes return type, name, parameters, and semicolon. No function body! ``` add.cpp ``` #include "add.h" // Insert contents of add.h at this point. Note use of double quotes here. int add(int x, int y) { return x + y; } ``` main.cpp ``` #include "add.h" // Insert contents of add.h at this point. Note use of double quotes here. #include int main() { std::cout << "The sum of 3 and 4 is " << add(3, 4) << '\n'; return 0; } ``` What if add.cpp only contained :- add.cpp ``` int add(int x, int y) { return x + y; } ``` So what if we changed something in add.cpp but not in add.h ? For example add.cpp ``` double add(int x, int y) { return x + y; } ``` main.cpp ``` #include "add.h" // Insert contents of add.h at this point. Note use of double quotes here. #include int main() { std::cout << "The sum of 3 and 4 is " << add(3, 4) << '\n'; return 0; } ``` add.h ``` int add(int x, int y); // function declaration includes return type, name, parameters, and semicolon. No function body! ``` Then look preprocessor will include add.h into main.cpp which will look like this :- main.cpp ``` int add(int x, int y); #include int main() { std::cout << "The sum of 3 and 4 is " << add(3, 4) << '\n'; return 0; } ``` main.cpp , add.cpp will ALL OF THEM INDIVIDUALLY compile sucessfully but LINKER WILL GIVE ERROR BECAUSE IT WILL NOT BE ABLE TO FIND IMPLEMENTATION OF int add(int x, int y); WHICH WAS IS NEEDED IN FUNCTION CALL IN MAIN.CPP. BECAUSE WE HAVE THE IMPLEMENTATION OF double add(int x, int y); IN add.cpp. INSTEAD IF #include "add.h" WAS ALREADY PRESENT IN ADD.CPP THEN add.cpp ``` #include "add.h" // Insert contents of add.h at this point. Note use of double quotes here. double add(int x, int y) { return x + y; } ``` PREPROCESSOR WOULD CONVERT IT TO add.cpp ``` int add(int x, int y) double add(int x, int y) { return x + y; } ``` WHICH IS COMPILER ERROR IT WILL BE AN ADD.CPP COMPILE TIME ERROR. THIS IS ALSO NOT A VALID FUNCTION OVERLOADING ALSO BECAUSE IN FUNCTION OVERLOADING NAME OF THE FUNCTION SHOULD REMAIN SAME AND NUMBER OF PARAMETERS ARE DIFFERENT BUT RETURN TYPE CANNOT BE USED AS A BASIS FOR FUNCTION OVERLOAD.