Я написал немного C, и я могу прочитать его достаточно хорошо, чтобы получить общее представление о том, что он делает, но каждый раз, когда я сталкивался с макросом, он полностью меня бросил, Я в конечном итоге должен помнить, что такое макрос, и заменить его в моей голове, когда я читаю. Те, с которыми я столкнулся, были интуитивными и понятными, всегда были маленькими мини-функциями, поэтому я всегда задавался вопросом, почему они были не просто функциями.
Я могу понять необходимость определения различных типов сборки для отладки или кросс-платформенных сборок в препроцессоре, но способность определять произвольные подстановки, по-видимому, полезна только для того, чтобы сделать уже трудный язык еще труднее понять.
Почему такой сложный препроцессор появился для C? И есть ли у кого-нибудь пример его использования, который заставит меня понять, почему он все еще используется для целей, отличных от простых, если условные компиляции стиля #debug?
Edit:
Прочитав ряд ответов, я все еще просто не понимаю. Самый общий ответ - встроенный код. Если ключевое слово inline не делает этого, то либо у него есть веская причина не делать этого, либо для исправления реализации. Я не понимаю, почему нужен совершенно другой механизм, который означает "действительно встроить этот код" (кроме того, что код, написанный до того, как был встроен). Я также не понимаю идею, что было упомянуто, что "если ее слишком глупо, чтобы быть включенным в функцию". Разумеется, любая функция кода, которая принимает входные данные и выводит результат, лучше всего вводить в функцию. Я думаю, что я не могу получить его, потому что я не привык к микро оптимизациям написания C, но препроцессор просто чувствует себя как сложное решение нескольких простых проблем.