I think Visual Studio Code is the easiest option, and makes most sense here.
You could also use
cscope (either from package management, or
upstream). It provides a vim-like editor, and lets you locate and edit each instance; but AFAIK does not provide a batch replacement interface.
If you create file
cscope.files containing the (relative) paths to the C source and header files affected, and run
cscope -bc, cscope generates an ASCII line-based database
cscope.out, that a simple UI could use to make the changes in parallel, showing each change (with a few lines of context) to the user to verify whether the replacement should be applied or not, advancing through the source files in line order; only asking the user whether each change should be applied (
y/
n/
q, for Yes, No, or Quit). (I would "store" the changes, and not apply them directly, so that the user could also go back to earlier decisions and change them, and only apply the changes after all choices (to all, or just the current file) have been made. This reduces the risk of bugs due to editing the file and making the database out of date.)