Как переопределить макрос с помощью его предыдущего определения

Предположим, что у меня есть следующий макрос:

#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 это должно быть возможно

8
задан Brian Tompsett - 汤莱恩 25 February 2016 в 17:18
поделиться

4 ответа

Макросы со ссылками на себя вообще не работают:

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);
}

}
3
ответ дан 5 December 2019 в 12:07
поделиться

Невозможно. Макросы могут использовать другие макросы, но они используют определение, доступное во время развертывания, а не время определения. Макросы в C и C ++ не могут быть рекурсивными, поэтому xxx в вашем новом макросе не раскрывается и рассматривается как функция.

6
ответ дан 5 December 2019 в 12:07
поделиться

Вы не сможете повторно использовать старое определение макроса, но вы можете отменить его и создать новое определение. Надеюсь, это не так уж сложно скопировать и вставить.

#ifdef xxx
#undef xxx
#endif
#define xxx(x) printf("%s\n",x);

Я рекомендую определить макрос xxx2 .

#define xxx2(x) do { xxx(x); yyy(x); } while(0);
3
ответ дан 5 December 2019 в 12:07
поделиться

Это не совсем то, о чем вы просите, но это может помочь.

Вы можете #undef макрос перед тем, как дать ему новое определение.

Пример:

#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever

Я никогда не слышал (и не видел) рекурсивных макросов. Я не думаю, что это возможно.

0
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: