- •Использование аргументов командной строки
- •Доступ к argv и argc
- •Выполнение цикла, пока argv не содержит null
- •Трактовка argv как указателя
- •Использование аргументов командной строки
- •Доступ к переменным среды операционной системы
- •Использование констант и макрокоманд
- •Использование именованных констант
- •Использование именованных констант для упрощения изменения кода
- •Замена выражений макрокомандами
- •Чем макрокоманды отличаются от функций
Чем макрокоманды отличаются от функций
Определение макрокоманды не является функцией. Если программа использует функцию, то в выполняемую программу помещается только одна копия операторов функции. Каждый раз при вызове функции программа помещает параметры в стек и затем выполняет переход к коду функции. После завершения функции программа удаляет параметры из стека и переходит обратно к оператору, который следует непосредственно за вызовом функции.
В случае с макрокомандой препроцессор заменяет в коде каждую ссылку на макрокоманду соответствующим определением макрокоманды. Например, если предыдущая программа использует макрокоманду CUBE в 100 различных местах, препроцессор подставит код макрокоманды 100 раз. Используя макрокоманды, можно избежать издержек на вызов функции (издержек на помещение параметров в стек и удаление их оттуда, а также издержек на выполнение перехода к коду функции и возврат из него). Это происходит благодаря тому, что в случае с макрокомандой препроцессор встраивает в тело программы соответствующие операторы. Однако, поскольку препроцессор заменяет каждую ссылку на макрокоманду соответствующим кодом, макрокоманды увеличивают размер вашей выполняемой программы.
Макрокоманды можно использовать в программах различным образом. Однако цель использования макрокоманд состоит в упрощении кодирования и улучшении восприятия программ. Следующая программа MACDELAY.CPP иллюстрирует гибкость макрокоманд. Кроме того, эта программа поможет лучше представить, как препроцессор заменяет имя макрокоманды соответствующими операторами:
#include <iostream.h>
#define delay(х)
{ \ cout << "Задержка на " << х << endl; \ for (long int i=0; i < х; i++) \ ; \ }
void main (void)
{ delay(l00000L); delay(200000L); delay(300000L); }
В данном случае, поскольку определение макрокоманды занимает несколько строк, это определение помещает один символ обратного слэша (\) в конце каждой строки, которая имеет продолжение. Когда препроцессор встретит ссылку на макрокоманду, он заменит эту ссылку операторами, которые появляются в определении макрокоманды.