2014-12-27 4 views
0
#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; 

ответ

3

Было бы правильнее сказать, что объявляет глобальный оператор, чем на самом деле определяет. Ключевое слово: operator, а символ оператора - отдельный токен. И вы можете вставлять только идентификаторы, а не идентификатор и символ оператора.

Таким образом, вы могли бы получить вторую версию, чтобы работать, понижая ##:

#define DEFINE_GLOBAL_OPERATOR(SYMBOL) \ 
      X operator SYMBOL(const X &, const X &); 

struct X {}; 
DEFINE_GLOBAL_OPERATOR(+); 
Смежные вопросы