в чем разница между макросом и функцией в c?

<p>в чем разница между макросом и функцией в<strong>c</strong>? подскажите пожалуйста одно приложение, где я могу использовать макросы и функции?</p>

<h3>преимущества и недостатки макросов</h3><p><strong> преимущества </strong></p><ul> <li>эффективность времени.</li> <li>не нужно передавать аргументы типа функции.</li> <li>это предварительно обработано.</li> <li>легче читать.</li> </ul><p><strong> недостатки </strong></p><ul> <li>очень сложно отлаживать в большом коде.</li> <li>возьмите больше памяти в стеке по сравнению с функцией. предположим, что в программе есть макрос, который использовал 50 раз, что означает, что он будет использовать память 50 раз, но в функции, если функция вызывается 50 раз, она будет каждый раз занимать одну память, потому что каждый раз, когда она освобождает эту память</li> </ul>

<p>основное отличие состоит в том, что функция компилируется, а макрос обрабатывается. когда вы используете вызов функции, он будет переведен в asm call со всеми этими операциями стека для передачи параметров и возвращаемых значений. когда вы используете macro, препроцессор c будет переводить все строки, используя макрос, а затем компилировать.</p><p>минус использования макросов в том, что они скрывают реализацию. его путь труднее найти ошибку, если есть.</p>

<p>в c (и c++) макрос является директивой препроцессора. это означает, что до того, как ваша программа начнет компилироваться, она пройдет и обработает все ваши макросы. макросы полезны, потому что</p><ul> <li>они могут сделать вашу программу проще для чтения</li> <li>они могут повысить эффективность (так как они могут быть рассчитаны во время компиляции)</li> <li>они могут сократить длинные или сложные выражения, которые часто используются. например, мы используем макрос для получения текущего регистратора log4cpp и еще несколько для записи в него с различными уровнями.</li> </ul><p>disdvatages</p><ul> <li>расширьте размер вашего исполняемого файла</li> <li>может затопить ваше пространство имен, если не соблюдать осторожность. например, если у вас слишком много макросов препроцессора, вы можете случайно использовать их имена в своем коде, что может быть очень запутанным для отладки.</li> </ul><p>пример</p><pre><code>#define increment(x) x++ </code></pre><p>функция - это фрагмент кода, который может быть относительно независимо выполнен и выполняет определенную задачу. вы можете думать об этом как о математической функции: функция с заданным набором входных данных даст конкретный результат. в с они определены как</p><pre><code><return type> <name>(<parameters>) { //code body } </code></pre>

<p>и еще одно отличие состоит в том, что в функции есть служебные данные стека, но в случае макросов нет служебных данных стека; это просто расширение кода.</p>

<p>вы должны думать о макросе просто как о замене текста: это как встроенный код макроса каждый раз, когда вы видите макрос в своем коде. это хорошо для «фрагментов кода», потому что вы избегаете накладных расходов на вызовы функций, потому что каждый раз, когда вы вызываете функцию, вы прикладываете некоторые усилия для помещения параметров в стек.</p>