Использовать двойные двоеточия (: :) в #define

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

 // foo.h #define template template  #define foo:: foo:: 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-errors.

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

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

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