代码之家  ›  专栏  ›  技术社区  ›  Some Name

宏定义中的转义结构字段

  •  0
  • Some Name  · 技术社区  · 6 年前

    我有以下结构(简化):

    struct error_t{
        const char *file;
        const char *error_desc;
    };
    

    我写了一个宏来创建这个结构

    #define ERROR_SET(error_desc) \
    { \
       struct error_t tmp = {.error_desc = error_desc, .file = __FILE__}; \
       struct error_t *ptr = malloc(sizeof(*ptr)); \
       memcpy(ptr, &tmp, sizeof(tmp)); \
       *error_ptr = ptr; \
    }
    

    问题是在生产线上

    struct error_t tmp = {.error_desc = error_desc, .file = __FILE__}
    

    二者都 error_desc s .error_desc = error_desc 错误描述 _error_desc ,但也许有更好的方法。也许我们可以“逃离”这个世界 替换为 .error_desc ?

    3 回复  |  直到 6 年前
        1
  •  3
  •   sarwar    6 年前

    只是不要对参数和结构成员使用相同的名称

        2
  •  2
  •   P.W    6 年前

    error_desc .

    #define ERROR_DESC error_desc
    

    然后你可以定义 ERROR_SET 这样地:

    #define ERROR_SET(error_desc) \
    { \
       struct error_t tmp = {.ERROR_DESC = error_desc, .file = __FILE__}; \
       struct error_t *ptr = malloc(sizeof(*ptr)); \
       memcpy(ptr, &tmp, sizeof(tmp)); \
       *error_ptr = ptr; \
    }
    

        3
  •  1
  •   AnT stands with Russia    6 年前

    你可以用类似的东西“欺骗”预处理器

    #define CONCAT(a, b) a##b
    
    #define ERROR_SET(error_desc) \
    { \
       struct error_t tmp = { .CONCAT(error,_desc) = error_desc, .file = __FILE__ }; \
       ...\
    }
    

    但这并不值得。只需重命名参数。并为参数命名制定一个约定,这将有助于您在将来避免此类命名冲突。


    仔细想想,额外的 CONCAT 宏甚至不是必需的。这将实现同样的目标

    #define ERROR_SET(error_desc) \
    { \
       struct error_t tmp = { .error##_desc = error_desc, .file = __FILE__ }; \
       ...\
    }