Я пытаюсь сделать что-то похожее на это:
#include <iostream>
int main()
{
std::cout << 1 << 5 << std::endl;
}
Ты прав. Вы пытаетесь сделать что-то похожее на это. Однако проблема не имеет ничего общего с макросом (я имею в виду, что это тоже проблема, но об этом позже). Проблема в том, что ваша цель не в том, что вы имеете в виду. Вы не имеете в виду std::cout << 1 << 5 << std::endl;
, вы имеете в виду std::cout << (1 << 5) << std::endl;
Разница в том, что первое разбивается на что-то вроде этого:
std::cout << 1;
std::cout << 5;
std::cout << std::endl;
Пока вы хотите что-то вроде этого:
int i = 1 << 5;
std::cout << i;
std::cout << std::endl;
Или что-то на этот счет.
Ответ прост: либо используйте круглые скобки в своем выражении cout
, либо вставьте их в свой макрос (лучший вариант):
// either
cout << (BIT_SHIFT(1, 5)) << std::endl;
// or
#define BIT_SHIFT(x,y) (x << y)
...
cout << BIT_SHIFT(1, 5) << std::endl;
Кроме того, как кто-то еще предложил, вы можете даже пойти на шаг дальше, если хотите, и сделать это:
#define BIT_SHIFT(x,y) ((x) << (y))
...
cout << BIT_SHIFT(1, 5) << std::endl;
Таким образом, если вы делаете что-то странное в x
или y
, ваш код не ломается.