ODR (One Definition Rule) applies to definitions. A prototype is the declaration (of a function); we can declare the same thing as many times as we want.
Types (for instance, structures) can be defined in more than one translation unit; but each translation unit can't have more than one definition and the definitions in different translation units must (logically) be the same.
externint i ; // declaration
externint i ;
int i = 8 ; // definition (external linkage; only once in the entire program)
externint i ;
int foo(int) ; // declaration
int foo( int a ) { return a*2 ; } // definition (external linkage; only once in the entire program)
int foo(int) ;
struct A ; // declaration
struct A ; // declaration
struct A // definition (type; only once per translation unit)
{
// ....
};
struct A ; // declaration
int main()
{
}