arduino has its own little .ino preprocessor that generates forward declarations (like in a header file) for all function in the project's .ino files. Most of the time this just makes things less confusing for new users, but sometimes it can cause errors more complicated projects.
I'm not familiar with the entire process, but the effect is that any function in any .ino is known to all other .ino code.
Anything with .h or .cpp in a library or in the project file is treated as normal c++ code and not subject to arduino's manipulations. It will need "#include"s.
If you are interested, there is a hack to make arduino not mess with a function in a .ino file: add an empty "throw()" like this:
void foo() throw() {
}