This is what encapsulation is for; i.e. this is (part of) what C++ is for. When you've got C code which needs to be written in a certain stylised way -- disable_irq/enable_irq pairs, memory handling -- C++ often lets you design an API in which only safe programs can be expressed. (RAII and std::string respectively, for those two examples.)
This part of C++ (unlike some of the others e.g. exceptions, RTTI) requires no runtime support and is in theory no less efficient than the equivalent C would be if written-out.
So the "pure C, not C++" questioner has it backwards, i.e. has needlessly restricted the question to not permitting the actual answer. (Unless they're using such a restricted embedded system that C++ is way out -- perhaps on a DSP like those squalid Sigmatel things that Rio Chiba/Carbon/etc were made from.)
And yes, IMO Linus Torvalds is dead wrong on this. The kernel is chock-full of C++ -- all those fops and vops structures are in fact just vtables -- it's just that he quixotically prohibits all this C++ from being written in the normal idiom.
Peter