You can't "mix pure C with objective C" like this.
Not sure if you have some functions in a .c file, or simply a C function (not a method) within a .mm file, since you haven't stated. But, no difference, really.
If you have a pure C function you can't just plop some Objective-C in the middle of it. I know this is confusing because, of course, you CAN just plop some plain-old C in the middle of some Object-C code.
That is because Objective-C simply adds some features to C. NOT the other way around!
I believe that there is a way to CALL an Objective-C method from within a C function, but I haven't done that so I don't know the details.
"self" is a bit of the magic that makes Objective-C "objective". Every Objective-C object has an implied variable called "self". You don't declare it - it is declared for you behind the scenes. It is a pointer that points to the object's data storage block.
This is part of the thin veneer over C that is Objective-C. When you call an Objective-C method, the "self" variable of the method's object is a hidden, implied first parameter.
If you want to see some really goofy C code, take a look at the IJG JPEG library. (Which will be found under the hood of most JPEG implementations.) It's object-oriented code written in pure C. It's both ugly and elegant. They have to carry all those "self's" around explicitly. Yuck.
The best way to use pure C with Objective-C is for simple functions that are passed a parameter (or parameters) and return a result. Treat C code as a separate, black-box blob. It's great that we can use pure C, because we can leverage legacy libraries. Particularly nice if you have some complex math for which there is a well-tested workhorse library or function available.