I have encountered a working (with XLC8 and MSFT9 compilers) piece of code, containing a C++ file with a function defined with C linkage and a reference argument. This bugs
I think you already got some good answers so just pointing out something extra on your question.
My humble understanding is that extern merely creates a C symbol.
So your example still "seems to work" (gcc/g++) even when I add a class object - I had to try ir to believe it:
class A {};
extern "C" void f(int &i, A a) {
i++;
}