代码之家  ›  专栏  ›  技术社区  ›  Bob

C宏-如何将宏名设置为另一个宏的输出

  •  -1
  • Bob  · 技术社区  · 6 年前

    我想创建一个宏,它的名称由两个东西串联而成,即

    #define name ## _body(a) \
        a
    

    但是 gcc -E 给出了错误

    macros.c:9:18:错误:“”不能出现在宏扩展的两端 #定义typename(正文)\

    问题

    可以这样做吗 仅使用C预处理器 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nominal Animal    6 年前

    #define  JOIN(a,b)       a ## b
    
    #define  FOO(suffix)     JOIN(FOO_, suffix)
    #define  FOOBAZ          JOIN(FOO_, BAZ)
    #define  FOOBAAZ         JOIN(foo_, baaz)
    
    #define  FOO_BAR         first
    #define  FOO_BAZ         second
    

    int FOO(BAR) = 1;
    int FOOBAZ = 2;
    int FOOBAAZ = 3;
    

    int first = 1;
    int second = 2;
    int foo_baaz = 3;
    

    #if defined(TYPE) && defined(PREFIX)
    #undef   JOIN2
    #define  JOIN2_(a,b)  a ## b
    #define  JOIN2(a,b)   JOIN2_(a, b)
    #define  NAME(end)    JOIN2(PREFIX, end)
    
    static inline TYPE NAME(_add)(const TYPE val1, const TYPE val2)
    {
        return val1 + val2;
    }
    
    static inline TYPE NAME(_sub)(const TYPE val1, const TYPE val2)
    {
        return val1 - val2;
    }
    
    static inline TYPE NAME(_neg)(const TYPE val)
    {
        return -val;
    }
    
    static inline TYPE NAME(_mul)(const TYPE val1, const TYPE val2)
    {
        return val1 * val2;
    }
    
    static inline TYPE NAME(_div)(const TYPE val1, const TYPE val2)
    {
        return val1 / val2;
    }
    
    #endif
    
    #undef   NAME
    #undef   JOIN2
    #undef   PREFIX
    #undef   TYPE
    

    NAME(suffix) PREFIX suffix

    NAME(_add) (const TYPE val1, const TYPE val2)

    #include <stdlib.h>
    #include <inttypes.h>
    #include <stdio.h>
    
    #define  TYPE    uint32_t
    #define  PREFIX  u32
    #include "ops.h"
    
    #define  TYPE    float
    #define  PREFIX  float
    #include "ops.h"
    
    #define  TYPE    double
    #define  PREFIX  dbl
    #include "ops.h"
    
    int main(void)
    {
        printf("dbl_div(217.0, 31.0) = %.1f\n", dbl_div(217.0, 31.0));
        printf("u32_sub(4, 2) = %" PRIu32 "\n", u32_sub(4, 2));
        printf("float_mul(1.25f, 72.00f) = %.2ff\n", float_mul(1.25f, 72.00f));
        return EXIT_SUCCESS;
    }
    

    #include "ops.h" u32_add() u32_sub() u32_neg() u32_mul() u32_div() float_add() dbl_add()

    dbl_div(217.0, 31.0) = 7.0
    u32_sub(4, 2) = 2
    float_mul(1.25f, 72.00f) = 90.00f
    

    _Generic