Ладно сдаюсь.
Если include - не директива компилятора, тогда директива чего?
Транслятора?
В справочнике по Си написано буквально следующее:
А как на самом деле?
Ликбез: (краткий)
Транслятор (с какого-то иностранного - переводчик) - автоматический (машинный, т.е. программа) переводчик с одного формального языка на другой.
Компилятор - транслятор с языка более высокого уровня на уровень ниже (как правило на язык Ассемблера). Напр - с Си на Асм.
-----
В родительском описании (у автора) языка Си описан механизм включения в исходный текст текста из других файлов (для удобства)..
Механизм был назван - Препроцессор, его команды не вошли в стандарт языка, но производители Компиляторов включают препроцессор в свои продукты по традиции, и можно считать, что препроцессор - полноправная часть языка Си (условно), и нужно понимать, что команды препроцессора не укладываются в синтаксис Си..
И все компиляторы (по традиции) со времен первого - DEC`овского строятся по единой "поточной" технологии (как принято в УНИХе (Юниксе): Компилятор состоит из группы программ - С0, С1, С2, С3, так, что выходной поток одной из них является входным для следующей.
Последовательность обработки исходного текста примерно следующая:
С0 - препроцессор (обрабатывает строки, начинающиеся с "#", все остальное - игнорирует),
С1 - синтаксический анализатор - только проверяет синтаксис Си, и сообщает об ошибках,
С2 - собственно компилятор с Си на метаязык,
С3 - компилятор с метаязыка на ассемблер,
С4 - С ассемблера на язык объектного модуля.
После этого всего в работу включается "Компановщик" - редактор связей, который собирает все потребные, и заявленные объектные модули (и их библиотеки) в одну прогу на языке загрузки (exe-файл).
-----
Вот теперь разберитесь, и скажите, как "#include" может вызвать синтаксическую ошибку?.
Не, конечно - у препроцессора есть своя диагностика, и он как все может выдать сообщение об ошибке, но только своих команд, а никак не синтаксиса Си..