Как переопределить макрос, используя его предыдущее определение - PullRequest
8 голосов
/ 21 июня 2010

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

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

Теперь в некоторых файлах я хочу использовать "улучшенную" версию этого макроса без изменения его имени.Новая версия исследует функциональные возможности исходной версии и делает еще несколько работ.

#define xxx(x) do { xxx(x); yyy(x); } while(0)

Это, конечно, дает мне предупреждение о переопределении, но почему я получаю 'xxx', не было объявлено в этой области?Как мне определить это правильно?

РЕДАКТИРОВАТЬ: в соответствии с этим http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html это должно быть возможно

Ответы [ 5 ]

6 голосов
/ 21 июня 2010

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

3 голосов
/ 21 июня 2010

Самореференциальные макросы вообще не работают:

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 голосов
/ 21 июня 2010

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

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

Моя рекомендация - определить макрос xxx2.

#define xxx2(x) do { xxx(x); yyy(x); } while(0);
2 голосов
/ 12 апреля 2013

Если нам известен тип параметра «x» в макросе «xxx», мы можем переопределить макрос, используя его в функции, а затем определить макрос «xxx» как эту функцию

Исходное определение дляМакрос 'xxx':

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

В определенном файле создайте расширенную версию макроса 'xxx':

/* before redefining the "xxx" macro use it in function 
 * that will have enhanced version for "xxx" 
 */
static inline void __body_xxx(const char *x)
{
    xxx(x);
    printf("enhanced version\n");
}

#undef  xxx
#define xxx(x) __body_xxx(x)
0 голосов
/ 21 июня 2010

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

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

Пример:

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

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

...