C言語のプリプロセッサの #define の文法は
コード:
# define identifier replacement-list new-line
または
コード:
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
となっています。
(引用元:
N1570 6.10.3 Macro replacement)
すなわち、置き換え元は識別子 (identifier) でなければなりません。
identifier は 6.4.2 Identifiers で定義されており、処理系によって使える文字を独自に増やせるともありますが、
*(p->func_addr) を識別子扱いするのは式の記述と衝突する可能性があり、さすがに無理があるでしょう。
どうしても #define を使いたいのであれば、
C言語とは関係なく独自に定義した #define を処理する独自の処理プログラムを開発し、使用するのがいいでしょう。