После того, как я прочитал статьи выше, я все еще не очень уверен, является ли макрос просто функцией или чем-то еще. Макрос равен функции?
Пример:
// 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;
В 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». Использование функции будет работать «как положено» здесь.
Других решений пока нет …