This is a bit confusing, because while .pde code is written in C style, it appears that it uses C++ linkage
Your .pde file is transformed into a .cpp file before the C++ compiler is invoked. So, it is not surprising that C++ linkage is used.
I tried doing it in C (.c files) first and got some errors.
It could be done in a .c file, if you use the extern "C" modifier appropriately. Using the .cpp extension is just easier.
I also discovered, not too surprisingly, that the function pointer passed to attachInterrupt() must use C linkage.
Not true. It must be not be a member function, though.