(C11) 泛型表达式

文章目录

  • ⭐语法
  • ⭐举例
    • 🚩判断对象类型
    • 🚩判断指针
    • 🚩函数重载
    • 🚩嵌套使用
  • END

⭐语法

Ref: 泛型选择 (C11 起) - cppreference.com

关键词:

  • Generic
  • default
_Generic(控制表达式 , 关联列表)  (C11 起) 

关联列表

  • 类型名:表达式
    • 类型名:任何并非可变修改的完整对象类型(即既非 VLA 亦非指向 VLA 的指针)。
    • 表达式:任何类型和值类别的表达式(除了逗号运算符)
  • default:表达式

控制表达式

  • 任何表达式(除了逗号运算符),若不使用 default 关联,则其类型必须与 类型名 之一兼容。

判定解释

控制表达式 的类型经历左值转换。

只在类型域中进行转换

  • 舍弃顶层 cvr 限定符和原子属性
  • 数组到指针/函数到指针变换
  • 不实例化任何副效应或计算任何值

有类型匹配,若其类型与各关联之一的 类型名 兼容,则解释为冒号后的表达式。

无类型匹配,且提供了 default 关联,则解释为其后的表达式。

注意

关联列表 中的任意二个 类型名 不能指定兼容类型。

使用关键词 default 的关联只能有一个。若不使用 default,且无一 类型名 与控制表达式类型兼容,则程序无法编译。

⭐举例

🚩判断对象类型

_Generic可以判断自定义类型。

cvr限定符对类型识别不受影响。

default不是必须写道最后一个,顺序这方面没有限制。

#include <stdbool.h>
#include <stdio.h>

struct Node {};

#define get_typename(x)             \
    _Generic((x),                   \
        default: "other",           \
        _Bool: "bool",              \
        int: "int",                 \
        char: "char",               \
        struct Node: "struct Node"  \
    )
    
int main() {
    _Bool       b = true;
    char        c = 'a';
    const int   i = 10;
    struct Node node;

    printf("Type of [_Bool] is %s\n", get_typename(b));
    printf("Type of [char] is %s\n", get_typename(c));
    printf("Type of [int] is %s\n", get_typename(i));
    printf("Type of [struct Node] is %s\n", get_typename(node));
}

🚩判断指针

对指针类型的判断仍然使用。

#include <stdio.h>

#define get_pointname(x) \
    _Generic((x),        \
        int*: "int*",    \
        void*: "void*",  \
        default: "other" \
    )

int main() {
    int   i  = 0;
    int*  ip = NULL;
    void* vp = NULL;

    printf("Type of [int] is [%s]\n", get_pointname(i));
    printf("Type of [int*] is [%s]\n", get_pointname(ip));
    printf("Type of [void*] is [%s]\n", get_pointname(vp));
}

🚩函数重载

可以根据类型指定调用的函数,注意参数个数。

下方代码展示在使用_Generic时,并且直接调用的情况。_Generic((x), default: fun)(x)

#include <math.h>
#include <stdio.h>

int default_fun() {
    printf("Line[%d], Func[%s]\n", __LINE__, __func__);
    return -1;
}

#define sqrt(x)                  \
        _Generic((x),            \
            float: sqrtf,        \
            double: sqrt,        \
            long double: sqrtl,  \
            default: default_fun \
        )(x)

int main(void) {
    int         i  = 4;
    float       f  = 4.0f;
    double      d  = 4.0;
    long double ld = 4.0L;

    printf("[i] sqrt = %d\n", sqrt(i));
    printf("[float] sqrt = %f\n", sqrt(f));
    printf("[double] sqrt = %lf\n", sqrt(d));
    printf("[long double] sqrt = %Lf\n", sqrt(ld));
}

🚩嵌套使用

由于每次_Generic只能判断一个表达式的类型,因此如果是需要用到多参的话,可以嵌套的使用_Generic

#include <stdio.h>

#define add(x, y)                              \
    _Generic((x),                              \
        int: _Generic((y),                     \
            int: (int)(x) + (int)(y),          \
            default: (int)(x) + (double)(y)    \
        ),                                     \
        default: _Generic((y),                 \
            int: (double)(x) + (int)(y),       \
            default: (double)(x) + (double)(y) \
        )                                      \
    )

int main() {
    int    i1 = 10;
    int    i2 = 20;
    double d1 = 3.14;
    double d2 = 2.71;

    printf("%d + %d = %d\n", i1, i2, add(i1, i2));  // 整数加法
    printf("%f + %f = %f\n", d1, d2, add(d1, d2));  // 浮点数加法
    printf("%d + %f = %f\n", i1, d2, add(i1, d2));  // 混合加法
}

END

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习中文笔记.pdf

深度学习和机器学习应该如何入门呢&#xff1f;这是很多初学者经常提的问题&#xff0c;针对这个问题&#xff0c;相信很多过来人都会推荐吴恩达的在线课程。不过&#xff0c;由于是英文版本&#xff0c;就将很多人挡在了门外。 于是&#xff0c;在国内&#xff0c;以黄海广博士…

探索电商ERP平台的功能架构:实现高效运营的关键

在当今数字化时代&#xff0c;电子商务已经成为了商业运营的主流模式之一。为了应对日益激烈的市场竞争&#xff0c;企业需要借助先进的技术工具来提高运营效率和管理能力。在这篇博客中&#xff0c;我们将深入探讨电商ERP平台的功能架构&#xff0c;揭示其如何成为实现高效运营…

Qt for android : libusb在android中使用

简介 如何在Qt for Android中使用libusb&#xff0c; 其实libusb的文档里面都写的很清楚&#xff0c; 这里只是稍微做下整理。 libusb libusb github源码 libusb release的版本, 有编译好的静态 步骤 1. 下载libusb libusb v1.0.027 源码包 2. 整理提取libusb android使用源…

构建高效稳定的运维服务体系:技术架构解析与最佳实践

在当今数字化时代&#xff0c;运维服务对于企业的稳定运行和业务发展至关重要。本文将深入探讨运维服务的技术架构&#xff0c;介绍如何构建高效稳定的运维服务体系&#xff0c;并分享最佳实践。 ### 1. 概述 运维服务的技术架构是支撑整个运维体系的核心&#xff0c;它涵盖了…

数字孪生技术助力智慧园区建设

随着城市化进程的加速和科技创新的推动&#xff0c;城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性&#xff0c;是一个亟待解决的问题。在这个背景下&#xff0c;智慧园区作为一种新型的城市发展模式&#xff0c;引起了越来越多的关注和探索。 什么是智慧园区&…

如何将天猫内容保存为PDF格式?详细步骤与实战解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;保存天猫内容的重要性 二、环境准备与工具安装 1. 安装必要的Python包…

[数据集][目标检测]红外车辆检测数据集VOC+YOLO格式13979张类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;13979 标注数量(xml文件个数)&#xff1a;13979 标注数量(txt文件个数)&#xff1a;13979 标…

Ownips+Coze海外社媒数据分析实战指南

目录 一、引言二、ISP代理简介三、应用实践——基于Ownips和coze的社媒智能分析助手3.1、Twitter趋势数据采集3.1.1、Twitter趋势数据接口分析3.1.2、Ownips原生住宅ISP选取与配置3.1.3、数据采集 3.2、基于Ownips和Coze的社媒智能助手3.2.1、Ownips数据采集插件集成3.2.2、创建…

LeetCode //C - 143. Reorder List

143. Reorder List You are given the head of a singly linked-list. The list can be represented as: L0 → L1 → … → Ln - 1 → Ln Reorder the list to be on the following form: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … You may not modify the values i…

uniapp - 填充页面

在上一篇文章中&#xff0c;创建了一个空白的文章模块页面。在这一篇文章&#xff0c;让我们来向页面中填充内容。 目录 页面效果涉及uniapp组件1.view2.swiper3.scroll-view4.属性解读1) class"style1 style2 .."2) circular单属性无赋值3) :autoplay"autoplay…

Metasploit渗透测试工具使用

Metasploit Framework(MSF) 是一款开源安全漏洞检测工具&#xff0c;附带数千个已知的软件漏洞&#xff0c;并保持持 续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程&#xff0c;被安全社区冠以“可 以黑掉整个宇宙”之名。刚开始的Metasploit是采…

在Python中实现限定抽奖次数的机制

目录 一、引言 二、需求分析 三、设计思路 四、代码实现 4.1 使用字典存储用户抽奖次数 4.2 使用数据库存储用户抽奖次数 五、扩展与优化 六、总结 一、引言 在当今互联网应用中&#xff0c;抽奖系统作为吸引用户、提高用户参与度和活跃度的重要手段&#xff0c;已经被…

Windows 下载安装Apache

一、官网下载 1、打开Apache官网http://httpd.apache.org&#xff0c;点击Download。 2、选择Windows版本&#xff0c;点击链接。 3、选择对应版本选择下载。 二、安装、设置 1、将下载好的解压。 2、依次打开Apache24-conf-httpd.conf,用记事本打开 1)、修改路径 2)、修改…

PS Adobe Photoshop 2024 for Mac[破]图像处理软件[解]PS 2024安装教程[版]

Adobe Photoshop 2024 for Mac[破]图像处理软件[解]PS 2024安装教程[版] 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248839

【论文复现】——基于随机抽样与特征值法的点云平面稳健拟合方法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对点云数据含有异常值且传统拟合方法拟合结果不理想的情况,本文提出…

7 Series FPGAs Integrated Block for PCI Express IP核设计中的物理层控制核状态接口

物理层控制和状态允许用户应用程序根据数据吞吐量和电源需求来更改链路的宽度和速度。 1 Design Considerations for a Directed Link Change 在Directed Link Change&#xff08;定向链接更改&#xff09;期间需要注意的事项有&#xff1a; 链接更改操作&#xff08;Link c…

干货 | 学习网络安全,推荐6个常用的安全知识在线手册(非常详细)零基础入门到精通,收藏这一篇就够了

排名不分先后&#xff0c;欢迎各位小伙伴下方留言评论补充 **VulDoc ** 包含&#xff1a;IOT安全&#xff0c;Web安全&#xff0c;系统安全 地址&#xff1a;http://47.112.148.3:8000/ **滴水逆向学习笔记 ** 包含 汇编 C C Win32 MFC 网络编程 数据库 数据…

Clickhouse MergeTree 存储引擎架构总结——Clickhouse 架构篇(二)

文章目录 前言MergeTree存储引擎的三大特点MergeTree 的数据组织MergeTree的文件组织数据文件、元数据文件、索引文件和其他文件分区数据库和表 索引与事务数据库存储引擎的对比存储引擎如何影响查询速度MergeTree存储引擎的工作过程 前言 存储引擎是ClickHouse非常重要的一个…

曲线拟合工具软件(免费)

曲线拟合是数据处理中经常用到的数值方法,本质是使用某一个模型(方程或者方程组)将一系列离散的数据拟合成平滑的曲线或者曲面,数值求解出对应的函数参数,大家可以利用MATLAB的曲线拟合工具箱也可以使用第三方的拟合软件,今天我们介绍Welsim免费的曲线拟合软件 1、MATLA…

idea视图中顶部菜单栏找不到VCS

问题描述 idea视图中顶部菜单栏找不到VCS&#xff1a; 解决方案&#xff1a; 直接选择配置过git&#xff0c;此处操作&#xff1a; File->Settings->Version Control-> 点击 ->选择项目->VCS选择none ->点击apply -> 点击ok&#xff1a;