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