为了账号安全,请及时绑定邮箱和手机立即绑定

C11中_Generic的语法和示例用法

C11中_Generic的语法和示例用法

C
慕无忌1623718 2019-12-21 11:08:50
我听说C11添加了泛型。我已经用Google搜索了一下,看了一些文章,了解到有一个新的关键字(_Generic)等等。但我似乎无法掌握所有内容。它类似于C#中的泛型或C ++中的模板吗?谁能给我关于C11泛型定义的简要说明,其语法和简单的示例用法示例?
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

这是一个很好的介绍。这是概述:


通用选择是通过新关键字_Generic实现的。语法类似于类型的简单switch语句:_Generic( 'a', char: 1, int: 2, long: 3, default: 0) 取值为2(字符常量在C中为int)。


基本上,它的工作方式类似于的switch,其中标签是类型名称,将根据第一个表达式的类型('a'上述)进行测试。结果成为评估的结果_Generic()。


查看完整回答
反对 回复 2019-12-21
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我看到的最好的例子启发了以下(可运行的)示例,该示例为破解内省开辟了各种奇特的可能性...


#include <stdio.h>

#include <stddef.h>

#include <stdint.h>


#define typename(x) _Generic((x),        /* Get the name of a type */             \

                                                                                  \

        _Bool: "_Bool",                  unsigned char: "unsigned char",          \

         char: "char",                     signed char: "signed char",            \

    short int: "short int",         unsigned short int: "unsigned short int",     \

          int: "int",                     unsigned int: "unsigned int",           \

     long int: "long int",           unsigned long int: "unsigned long int",      \

long long int: "long long int", unsigned long long int: "unsigned long long int", \

        float: "float",                         double: "double",                 \

  long double: "long double",                   char *: "pointer to char",        \

       void *: "pointer to void",                int *: "pointer to int",         \

      default: "other")


#define fmt "%20s is '%s'\n"

int main() {


  size_t s; ptrdiff_t p; intmax_t i; int ai[3] = {0}; return printf( fmt fmt fmt fmt fmt fmt fmt fmt,


     "size_t", typename(s),               "ptrdiff_t", typename(p),     

   "intmax_t", typename(i),      "character constant", typename('0'),

 "0x7FFFFFFF", typename(0x7FFFFFFF),     "0xFFFFFFFF", typename(0xFFFFFFFF),

"0x7FFFFFFFU", typename(0x7FFFFFFFU),  "array of int", typename(ai));

}

                 ╔═══════════════╗ 

═════════════════╣ Amazeballs... ╠═════════════════════════════════════

                 ╚═══════════════╝ 

            size_t is 'unsigned long int'

         ptrdiff_t is 'long int'

          intmax_t is 'long int'

character constant is 'int'

        0x7FFFFFFF is 'int'

        0xFFFFFFFF is 'unsigned int'

       0x7FFFFFFFU is 'unsigned int'

      array of int is 'other'


查看完整回答
反对 回复 2019-12-21
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我使用的是clion 1.2.4,而clion现在不支持c11,因此我在c99中使用以下代码而不是_Generic


#include <stdio.h>


int main(int argc, char **argv) {

    char *s;

    if (__builtin_types_compatible_p(__typeof__(s), long)) {

        puts("long");

    } else if (__builtin_types_compatible_p(__typeof__(s), char*)) {

        puts("str");

    }

    return (0);

};


查看完整回答
反对 回复 2019-12-21
  • 3 回答
  • 0 关注
  • 895 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信