首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C11中_Generic的语法和用法示例

C11中_Generic的语法和用法示例
EN

Stack Overflow用户
提问于 2012-03-21 20:11:35
回答 3查看 41.8K关注 0票数 72

我听说C11增加了泛型。我用谷歌搜索了一下,看了一些文章,了解到有一个新的关键字( _Generic )等等。但我似乎不能全部掌握。

它是类似于C#中的泛型还是C++中的模板?谁能给我简单解释一下泛型的C11定义,它的语法和一个简单的示例用法示例?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-21 20:14:12

This是一个非常好的介绍。以下是概述:

通用选择是通过一个新关键字实现的:_Generic。其语法类似于类型的简单切换语句:_Generic( 'a', char: 1, int: 2, long: 3, default: 0)的计算结果为2(字符常量在C中为整数)。

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

票数 53
EN

Stack Overflow用户

发布于 2013-06-25 14:19:45

The best example I have seen启发了以下(可运行的)示例,它为破解的自省解锁了各种奇怪的可能性……

代码语言:javascript
复制
#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'

票数 102
EN

Stack Overflow用户

发布于 2016-01-19 21:38:39

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

代码语言:javascript
复制
#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);
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9804371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档