#define DECLARE_GLOBAL_OPERATOR(OPERATOR) \
X OPERATOR(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(operator+);
Код выше объявляет глобальный оператор сложения, как можно было бы ожидать, но интуитивно простой вариант, в котором макрос принимает только символ оператора не работает на Clang 3.5.0 и ideone (протестировано с использованием C++ 11).Декларирование операторы, использующие макросы
#define DECLARE_GLOBAL_OPERATOR(SYMBOL) \
X operator##SYMBOL(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(+);
Здесь Clang жалуется говоря pasting formed 'operator+', an invalid preprocessing token
в то время как ideone выводит pasting "operator" and "+" does not give a valid preprocessing token
. Является ли этот код плохо сформированным?
Обратите внимание, что приведенный ниже код компилирует и выполняет хорошо, так что проблема не кажется, связана с проходящей +
, -
, x
или /
аргументов макроса.
#define WHATEVER(SYMBOL) \
int value = 2 SYMBOL 4;