макрос равен функции?

Неудачный макрос

Макро (информатика)

После того, как я прочитал статьи выше, я все еще не очень уверен, является ли макрос просто функцией или чем-то еще. Макрос равен функции?

Пример:

    //  Create a Direct3D 9 device.
hr = direct3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPP, &d3dDevice);

//  Cout out the message to indicate the failure.
if(FAILED(hr))
return 0;

0

Решение

В C и C ++ макрос — это механизм типа «замени это тем», и совсем не то же самое, что функция во многих смыслах. Это может ИНОГДА использоваться для замены функции, но вы должны быть очень осторожны. Вот некоторые известные «сбои» в макросах, используемых в качестве функций:

#define SQR(x) x * x

....

int x = 5;
int s = SQR(x+1);

Это даст не 36, а (x + 1 * x + 1), что в моей голове составляет 12 — не то, что вы хотели. Может быть исправлено с помощью функции или путем добавления дополнительных скобок вокруг x в SQR макро.

Еще одно «умное» использование макроса:

#define IS_UPPER(c)  ((c) >= 'A' && (c) <= 'Z')

char *str = "Some String With a few Upper Case letters";
int uppers = 0;
while(*str) if (IS_UPPER(*str++)) uppers++;

Теперь это пойдет не так (верхние значения гарантированно равны нулю в данном конкретном случае, если мы избежим сбоя из-за «пропущенного» маркера конца и продолжим работу …), потому что:

IS_UPPER(*str++)

переводится как:

(*str++) >= 'A' && (*str++) <= 'Z'

который, если str находится в начале строки «Some …», будет истинно для первого шага, но не верно для второго шага, так как теперь мы указываем на «o», которое не меньше или равно «Z». Использование функции будет работать «как положено» здесь.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector