Behind the scenes, bash simply expands the string "*.[ch]" to
all files that match (all .c and all .h files), prior to passing the arguments
So, "wc -l" actually sees a list of all those files as input, not the "*.[ch]" string.
This implies that wc can handle any number of files given as arguments and so you might as well specify multiple filters as well:
wc -l *.[cd] *.mdd
should do the trick...