I'm working this topic in u-ctags side.
With the change I proposed in https://github.com/universal-ctags/ctags/pull/2543, ctags can capture `foo` well:
``` $ cat /tmp/foo.c #define BLEH struct foo BLEH { int _; }; $ u-ctags --param-CPreProcessor:_expand=1 --fields-C=+{macrodef} --fields=+S -o - /tmp/foo.c <sor:_expand=1 --fields-C=+{macrodef} --fields=+S -o - /tmp/foo.c BLEH /tmp/foo.c /^#define BLEH$/;" d language:C file: macrodef: _ /tmp/foo.c /^struct foo BLEH { int _; };$/;" m language:C struct:foo typeref:typename:int file: foo /tmp/foo.c /^struct foo BLEH { int _; };$/;" s language:C file: ```