2013-06-30 3 views
0

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

Macro (computer science)

После прочтения статьи выше, я до сих пор не очень уверен, является ли макрос просто функция или что-нибудь еще. Является ли макрос равным функции?

Пример:

// 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

Я думаю, что если я правильно помню, макросы могут иметь или не иметь аргументов, но все функции выполняются. И макросы не возвращают ничего обратно вызывающему, тогда как функция должна иметь параметр или нет. – ha9u63ar

+1

Я использую cout << FAILED (hr) << endl; и проверьте его отображение нулевого значения в окне консоли. – zzz

+0

Да, точно, вы также можете иметь 'std :: cout << __ DO_SOMETHING__ << std :: endl;' тоже. – ha9u63ar

ответ

6

В C и C++ макрос является «заменить это тот» механизм типа, а вовсе не то же самое, как функция во многих смыслах. Его можно использовать для замены функции SOMETIMES, но вы должны быть очень осторожны. Некоторые известные «провалы» в макросы, используемые как функции заключаются в следующем:

#define SQR(x) x * x 

.... 

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

Это не даст 36, а (х + 1 * х + 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», , Использование функции будет работать «как ожидалось» здесь.

+0

Хороший ответ. Этого недостаточно, чтобы быть очень осторожным с использованием макросов! – Manuzor