Yeah it will be _foo in the object file instead of _foo@XYQWW or whatever the C++ vendor's convention is for encoding parameter type into the function name in the .obj/.lib/.dll is.
In C, a function name in the object file is the same as it is in the .c file with a _ prefixed to it. Note that having multiple functions using the same name (ie: operator overloading) is not possible, and C code will typically leave it up to the programmer to append parameter type to the function name by hand to avoid name collision (ie: look at OpenGL for example glVertex3f, glVertex2i, etc).
With operator overloading introduced in C++, multiple functions can have the same name, so C++ compilers will decorate or mangle a function name based on it's parameter list, ensuring that every function, even overloaded ones, have unique names for each permutation. Note that int foo(int) and int foo(float) are two functions that share one name. In the object file, one might be called _foo@XYZ while the other is _foo@WWYZ, in other words two unique functions.
If you referenced a C compiled function int foo(int) inside a .obj/.lib/.dll module from within a C++ compiler, it will look for _foo@XYZ and not be able to find it. By prototyping as extern "C" it will know to look for the legacy C _foo function signature in the external module. Note that you will not be able to overload a function declared as extern "C".
It's mostly used when using C libraries or legacy code or C compiled .dlls in C++ to ensure that compiled C++ code can find the undecorated C function names at link time. Much of the Windows DLLs for example are C so you'll see a lot of extern "C" in Windows headers so that they work in C++ compilers, otherwise you'd get a lot of "unresolved external reference" errors.