Используйте двойные двоеточия (: :) в #define - PullRequest
15 голосов
/ 23 октября 2011

Могу ли я использовать двойные двоеточия в #define? Я хотел бы сохранить некоторые записи в файлах реализации, например, как это:

// foo.h
#define template template <class T>
#define foo:: foo<T>::

template class foo {
  T& baz();
};

#include "foo.tpp"
#undef template
#undef foo::

// foo.tpp
template T& foo::baz() {
    // do stuff.
}

Но я получаю синтаксические ошибки, которые не совсем понимаю. (См. Пример на кодовой панели ):

Строка 11: ошибка: пропущены пробелы после имени макроса
Строка 10: ошибка: дополнительные токены в конце директивы #undef
Строка 4: ошибка: 'foo' не является шаблоном
компиляция прервана из-за ошибок -Wfatal.

1 Ответ

16 голосов
/ 23 октября 2011

Нет. Имя макроса должно быть идентификатором; он не может состоять из других символов и не может состоять из нескольких токенов.

#define template недопустимо, потому что template не является идентификатором, это ключевое слово.

#define foo:: foo<T>:: был действителен в C90 и C ++ 98: он определяет макрос с именем foo, который заменяется на :: foo<T>:: (это не то, что вы хотите сделать, но это было допустимо ). Однако это недопустимо в C99 и C ++ 11, поскольку в более новых версиях языков должен быть пробел между именем объектоподобного макроса и его списком замены (токенами, на которые он заменяется).

...