В 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», , Использование функции будет работать «как ожидалось» здесь.
Я думаю, что если я правильно помню, макросы могут иметь или не иметь аргументов, но все функции выполняются. И макросы не возвращают ничего обратно вызывающему, тогда как функция должна иметь параметр или нет. – ha9u63ar
Я использую cout << FAILED (hr) << endl; и проверьте его отображение нулевого значения в окне консоли. – zzz
Да, точно, вы также можете иметь 'std :: cout << __ DO_SOMETHING__ << std :: endl;' тоже. – ha9u63ar