【问题标题】:cross-compiling macro names交叉编译宏名称
【发布时间】:2010-01-19 15:48:11
【问题描述】:

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 分开,因为它们使用不同的宏来获取函数名称 FUNCTIONfunc。。 p>

但是,我有很多这样的 log_msg 需要写,我想知道是否可以避免因为一个宏不同而不得不写两次?

非常感谢您的建议,

【问题讨论】:

    标签: c


    【解决方案1】:

    为什么不这样做呢?

    #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 条件。)

    【讨论】:

    • 25 秒后得到完全相同的答案。
    • 谢谢,如果我在过去 8 年中写过任何 C 语言并且不必查找#define 某些东西的正确方法,我可能会赢。
    【解决方案2】:

    我将使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多