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

使用泛型关键字的宏的Eclipse CDT语法错误

  •  2
  • AlbusMPiroglu  · 技术社区  · 7 年前

    阅读a之后 similar

    例如,我的宏是:

    #define FIRST_(_1, ...) _1
    #define FIRST(...) FIRST_(__VA_ARGS__, _1, _2, _3)
    
    #define CONVERT(...)                            \
                    _Generic((FIRST(__VA_ARGS__)),  \
                        char*       : toText,   \
                        int         : toInt,    \
                        ) (__VA_ARGS__)
    

    和使用点,这会产生语法错误:

    void* test = CONVERT("testme");
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   HighCommander4    7 年前

    @ErikW 指出, _Generic This bug 跟踪添加对它的支持。

    (顺便提一下, contributions 非常欢迎使用Eclipse CDT的C11支持!)


    尝试定义另一个版本的 CONVERT(...)

    我可以想出两种方法:


    方法1

    CDT定义了一个特殊的宏 __CDT_PARSER__ 当解析代码时,其计算结果为true,但当实际编译代码时,其计算结果为false。

    您可以利用这一点定义不同版本的 就CDT而言:

    #ifdef __CDT_PARSER__
        #define CONVERT(...)
    #else
        #define CONVERT(...)                            \
                        _Generic((FIRST(__VA_ARGS__)),  \
                            char*       : toText,   \
                            int         : toInt,    \
                            ) (__VA_ARGS__)
    #endif
    

    void* test = CONVERT("testme", 42);
    

    void* test = ;
    

    转换(…) . 我们需要一个将解析为变量初始值设定项的扩展。 0 将工作:

    #ifdef __CDT_PARSER__
        #define CONVERT(...) 0
    #else
        ...
    #endif
    

    方法2

    转换(…) ,我们可以定义 _Generic(...)

    这一次,我们可以在“路径和符号”中这样做,因为没有重新定义 _泛型(…)

    让我们在“路径和符号”中定义一个符号,用 作为名称和空值。

    void*test=转换(“testme”,42);
    

    将扩展到:

    void* test = _Generic((FIRST("testme", 42)),  \
                        char*       : toText,   \
                        int         : toInt,    \
                        ) ("testme", 42)
    

    void* test = ("testme", 42);
    

    它解析( ("testme", 42) 解析为带括号的逗号表达式,因此是有效的初始值设定项)。

    _通用 宏,而不仅仅是 CONVERT

    另一方面,对于 _通用