Making each module expose an interface
You probably intended to write

typedef struct {
    int (*pFn)(int)
} Interface;

Use member names which are more descriptive than pFn. I hope that this was just as an example to post here.
Yes this approach can work well. I have worked on a bigger project where we used this OO-light approach for C by having an interface struct and each backend would fill it with it's own implementation.