Технически лучший способ сделать это - просто скомпилировать каждый файл. Настройка всех этих компиляций либо проста (потому что у вас есть сценарии сборки), либо будет h --- если у вас их нет, и разница может повлиять на ваш выбор решения.
Для C вам в значительной степени нужно запускать их через компилятор с включенным препроцессором. Если вы этого не сделаете, типичный C-код, содержащий макросы и условия препроцессора, вообще не будет обрабатываться.
Аналогично для C ++, хотя люди склонны меньше использовать препроцессор. Вам может не понравиться синтаксический анализатор исходного файла C ++, но любые синтаксические ошибки нужно будет проверить, чтобы выяснить, были ли они вызваны директивами препроцессора или макросами. Если вы не хотите настраивать сценарии компиляции, наш C ++ Formatter можно настроить для обработки кода без запуска препроцессора, поэтому он может быть полезен здесь. Он действительно анализирует файл, а затем распечатывает его; Вы можете просто проигнорировать часть prettyprint и проверить, имеет ли состояние выхода файл «OK» (без ошибок) или «not OK» (своего рода синтаксическая / семантическая ошибка).
В C # есть препроцессор, но он используется только в редких случаях. Вы можете найти похожий форматер C # у нас в нашем семействе форматеров для многих языков . Семейство обрабатывает не только определенный язык, но обычно несколько наиболее распространенных диалектов (GCC, MS, ...)