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 和 func 。
然而,我有很多这样的log_msg要编写,只是想知道是否有我可以避免为了一个宏不同而写两次这个?
非常感谢任何建议,
答案 0 :(得分:5)
为什么不做这样的事情?
#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__);
编辑:您当然可以通过将一个常量定义为另一个(即#define __func__ __FUNCTION__
条件的WIN32
来避免使用新常量。)
答案 1 :(得分:5)
我不会使用此解决方案,而是使用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