Предположим, что у меня есть следующий макрос:
#define xxx(x) printf("%s\n",x);
Теперь в определенных файлах я хочу использовать "расширенную" версию этого макроса, не меняя его имя. Новая версия исследует функциональность исходной версии и делает еще некоторую работу.
#define xxx(x) do { xxx(x); yyy(x); } while(0)
Это, конечно, дает мне предупреждение redefition, но почему я добираюсь, 'xxx' не был объявлен в этом объеме? Как я должен определить его правильно?
Править: согласно этому http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html это должно быть возможно
Макросы со ссылками на себя вообще не работают:
http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros
Если вы работаете над C ++, вы можете получить те же результаты с помощью шаблонных функций и пространств имен:
template <typename T> void xxx( x ) {
printf( "%s\n", x );
}
namespace my_namespace {
template <typename T> void xxx( T x ) {
::xxx(x);
::yyy(x);
}
}
Невозможно. Макросы могут использовать другие макросы, но они используют определение, доступное во время развертывания, а не время определения. Макросы в C и C ++ не могут быть рекурсивными, поэтому xxx в вашем новом макросе не раскрывается и рассматривается как функция.
Вы не сможете повторно использовать старое определение макроса, но вы можете отменить его и создать новое определение. Надеюсь, это не так уж сложно скопировать и вставить.
#ifdef xxx
#undef xxx
#endif
#define xxx(x) printf("%s\n",x);
Я рекомендую определить макрос xxx2
.
#define xxx2(x) do { xxx(x); yyy(x); } while(0);
Это не совсем то, о чем вы просите, но это может помочь.
Вы можете #undef
макрос перед тем, как дать ему новое определение.
Пример:
#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever
Я никогда не слышал (и не видел) рекурсивных макросов. Я не думаю, что это возможно.