кросс-компиляция имен макросов - PullRequest
4 голосов
/ 19 января 2010

gcc 4.4.2 c89

У меня есть следующий код.

#if defined ( __linux__ )
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n",
        strerror(errno), __func__, __LINE__);

#elif ( WIN32 )
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n",
        strerror(errno), __FUNCTION__, __LINE__);
#endif

Поскольку я компилирую как для Windows, так и для Linux, я должен отделить это log_msg, как указано выше, так как они используют разныемакросы для получения имени функции FUNCTION AND func .

Однако у меня есть много таких log_msg для записи, и просто интересно, есть ли в любом случае, я могу избежать необходимости писатьэто дважды ради того, чтобы один макрос был другим?

большое спасибо за любой совет,

Ответы [ 2 ]

5 голосов
/ 19 января 2010

Вместо этого решения я бы использовал рекомендованный обходной вариант, предложенный компилятором GCC. По существу определите следующий макрос и используйте __func__ везде

 #if __STDC_VERSION__ < 199901L
 # if __GNUC__ >= 2
 #  define __func__ __FUNCTION__
 # else
 #  define __func__ "<unknown>"
 # endif
 #endif

Ссылка: http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html

5 голосов
/ 19 января 2010

Почему бы не сделать что-то подобное?

#if defined ( __linux__ )
    #define FUNC_REF __func__
#elif ( WIN32 )
    #define FUNC_REF __FUNCTION__
#endif

log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n",
    strerror(errno), FUNC_REF, __LINE__);

edit: вы, конечно, можете избежать использования новой константы, определив одну как другую (то есть #define __func__ __FUNCTION__ для условия WIN32.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...