So firstly I want to ask why this:

add.c :
Code:
int add(int a,int b){
        return a+b;
}
main.c :
Code:
#include<stdio.h>

int main(){
        int a=3,b=7;
        printf("a+b=%d\n",add(a,b));
}
is getting compiled as it is, without including a header with the prototype of add by

$gcc add.c main.c

And secondly why when including custom headers, mean like "header.h" not in <>, when compiling have to give as arguments all the .c files and not just the one containing the main, like we do when using existing headers? are the .c files "of the" existing headers already compiled somewhere and just get linked of some kind?