В чем разница между макросом и функцией в C? Скажите, пожалуйста, одно приложение, в котором я могу использовать макросы и функции?
В чем разница между макросом и функцией в C?
Ответ 1
Основное отличие заключается в том, что функция скомпилирована и макрос предварительно обработан. Когда вы используете вызов функции, он будет переведен в ASM CALL со всеми этими операциями стека для передачи параметров и возвращаемых значений. Когда вы используете MACRO, препроцессор C переводит все строки с использованием макроса и компиляции.
Минус использования макросов заключается в том, что они скрывают реализацию. Его путь сложнее найти ошибку, если она есть.
Ответ 2
Преимущества и недостатки макросов
<сильные > Преимущества
- Эффективность времени.
- Не нужно передавать аргументы, подобные функции.
- Он предварительно обработан.
- Легче читать.
Недостатки
- Очень сложно отлаживать большой код.
- Возьмите больше памяти в стеке по сравнению с функцией. Предположим, что в программе есть макрос, который используется 50 раз, что означает, что он будет потреблять память 50 раз, но в функции, если функция вызывается 50 раз, каждый раз она будет потреблять одну память, потому что каждый раз, когда она освобождает эту память
Ответ 3
В C (и С++) макрос является директиву препроцессора. Это означает, что перед запуском компиляции программа будет проходить и обрабатывать все ваши макросы. Макросы полезны, потому что
- Они могут облегчить чтение вашей программы.
- Они могут повысить эффективность (поскольку их можно вычислить во время компиляции)
- Они могут сократить длинные или сложные выражения, которые используются много. Например, мы используем макрос, чтобы получить текущий log4cpp logger и еще несколько, чтобы написать ему с различными уровнями.
Disdvatages
- Расширьте размер исполняемого файла
- Можете наводнить ваше пространство имен, если не будете осторожны. Например, если у вас слишком много макросов препроцессора, вы можете случайно использовать их имена в своем коде, что может быть очень запутанным для отладки.
Пример
#define INCREMENT(x) x++
Функция представляет собой фрагмент кода, который может относительно независимо выполняться и выполняет определенную задачу. Вы можете думать о нем как о математической функции: функция, заданная набором входов, даст определенный результат. В C они определены как
<return type> <name>(<parameters>)
{
//code body
}
Ответ 4
И еще одно отличие состоит в том, что в функции есть накладные расходы на стек, но в случае макросов нет накладных расходов на стек; это просто расширение кода.
Ответ 5
Вы должны думать, что макрос точно так же, как и замена текста: как будто вы встроили макрокоманду каждый раз, когда вы видите макрос в своем коде. Это полезно для "фрагментов кода", потому что вы избегаете функции, вызывающей служебные данные, потому что каждый раз, когда вы вызываете функцию, вы пытаетесь оттолкнуть параметры в стек.
Ответ 6
Функция - это операция от значений до значений, т.е. тип данных, которые вы обычно думаете о работе с программой (числа, строки и т.д.).
Макрос - это операция от кода к коду. Он принимает часть программы и использует ее для генерации другой части для программы.
Между функциями и макросами в C нет перекрытия; они не делают то же самое. (Вы не можете написать функцию из значения в код, вы не можете, несмотря на внешность, написать макрос от кода до значения. Я знаю, что он выглядит так, как вы можете, но важно понять, что это не то, что вы на самом деле делает.)
Макрос можно сделать похожим на функцию, поскольку вы можете написать макрос, предназначенный для обработки фрагмента кода, который сам генерирует или представляет значение, но этот макрос все еще не работает на самом значении: он принимает генерирующий ценность код (который может быть простым числом) и переплетение его в ценностный код (который выглядит как "тело" макроса). Это означает, что использование макросов как функций чрезвычайно запутанно, а не то, для чего они лучше всего используются. Фактически, функции представляют собой единый дискретный блок кода.
Тот факт, что функции, обычно выполняемые во время выполнения, и макросы (в C) всегда выполняются во время компиляции, - это просто ограничение, налагаемое тем фактом, что значения обычно являются динамическими, а код обычно не доступен во время выполнения, соответственно. На самом деле это не фундаментальный аспект функций или макросов (функции могут быть встроены и оптимизированы, макросы могут применяться к динамически сгенерированному коду), и это немного красная селедка.
Ответ 7
Преимущество MACRO заключается в том, что мы определяем это только один раз, и если мы хотим изменить значение, мы можем внести изменения только в одном месте, а значение будет отражено в программе.