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