C语言高级用法---typeof()关键字

解析 typeof 和 instanceof 阅读详情
AI摘要

本文介绍了GUN C中typeof()特性,它可取得变量或表达式的类型。总结了其常见用法,如定义接收函数返回值的变量、在宏定义中动态获取结构体成员类型、直接取得已知类型等,并给出相应代码示例,虽未穷举所有情况,但涵盖核心用法。

前言

typeof() 是GUN C提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。

本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。

typeof()关键字常见用法

typeof()关键字常见用法一共有以下几种。

  1. 不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct apple{
        int weight;
        int color;
    };
    
    struct apple *get_apple_info()
    {
        struct apple *a1;
        a1 = malloc(sizeof(struct apple));
        if(a1 == NULL)
        {
            printf("malloc error.\n");
            return;
        }
    
        a1->weight = 2;
        a1->color = 1;
    
        return a1;
    }
    
    int main(int argc, char *argv[])
    {
        typeof(get_apple_info()) r1;//定义一个变量r1,用于接收函数get_apple_info()返回的值,由于该函数返回的类型是:struct apple *,所以变量r1也是该类型。注意,函数不会执行。
    
        r1 = get_apple_info();
    
        printf("apple weight:%d\n", r1->weight);
        printf("apple color:%d\n", r1->color);
    
        return 0;
    }
    
  2. 在宏定义中动态获取相关结构体成员的类型

    如下代码,定义一个和变量x相同类型的临时变量_max1,定义一个和变量y相同类型的临时变量_max2,再判断两者类型是否一致,不一致给出一个警告,最后比较两者。

    #define max(x, y) ({                \
        typeof(x) _max1 = (x);          \
        typeof(y) _max2 = (y);          \
        (void) (&_max1 == &_max2);      \//如果调用者传参时,两者类型不一致,在编译时就会发出警告。
        _max1 > _max2 ? _max1 : _max2; })
    

    如下代码,传入的a和b不是同一类型。

    int main(int argc, char *argv[])
    {
        int a=3;
        float b = 4.0;
        int r = max(a, b);
    
        printf("r:%d\n", r);
    
        return 0;
    }
    

    此时编译就会出现警告

    [root@xx c_base]# gcc test.c
    test.c: 在函数‘main’中:
    test.c:43: 警告:比较不相关的指针时缺少类型转换
    
  3. 也可直接取得已知类型

    如下代码,定义了一个int类型的指针p,像这种用法主没什么太大的意义了。

        int a = 2;
        typeof (int *) p;
        p = &a;
        printf("%d\n", *p);
    
  4. 其它用法

	//其它用法1
	char *p1;
    typeof (*p1) ch = 'a'; //ch为char类型,不是char *类型。
    printf("%d, %c\n", sizeof(ch), ch);//1, a

	//其它用法2
	char *p2;
    typeof (p2) p = "hello world";//此时的p才是char *类型,由于在64位机器上,所以指针大小为8字节
    printf("%d, %s\n", sizeof(p), p);//8, hello world

总结

以上例子并没有穷举所有的情况,但其核心用法基本上就会了,其它的例子也可参考网上的例子。

参考文章

C语言中typeof()函数的用法

C-Extensions

c语言typeof关键字(GCC) c语言typeof关键字(GCC) typeof关键字是C语言中的一个新扩展。 typeof的参数可以是两种形式:表达式或类型。 下面是使用表达式的的例子: typeof(x[ 0 ](1)) 这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。 如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。 以下示例声明了int类型的var变量,因为表达式foo()是... 阅读详情

相关推荐

【C语言】typeof 关键字详解

typeof 在宏定义中非常有用,尤其是当需要在宏中处理不同类型的变量时。

LuckiBit 2393

typeof的语法和使用

typeof的语法和使用

Binglianxiaojiao的博客 2万+

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 439

typeof和数据类型转换

变量的数据类型转换:将一种数据类型转换为另外一种数据类型。 通常有三种形式的类型转换: 转换为字符串类型 转换为数字型 转换为布尔型 我们不会将某个数据类型转换成 null 或者 undefined ,因为这样做,没有意义。 typeof 运算符 我们先来讲一下 typeof,再讲类型转换。 typeof()表示“获取变量的数据类型”,返回的是小写,语法为:(两种写法都可以) // 写法1 typeof 变量; // 写法2 typeof(变量); typeof 这个运算符的返回结果

qq_44278908的博客 1690

第四次工业革命如何重构产业逻辑:写给技术人的趋势推演

第四次工业革命正在以人工智能、大数据和新能源为核心重构全球产业逻辑。本文从历史规律切入,指出技术革命本质是生产力跃迁和产业链话语权的转移。当前AI基础设施竞赛已形成算力、数据、算法三大支柱,其中算力投资首超石油领域,绿色算力与新型架构成为关键。数据治理带来隐私计算等新技术约束,数据中心正向液冷技术和"东数西算"模式演进。技术人需构建三大竞争力:夯实分布式系统等底层能力、培养跨领域知识融合能力、善用约束条件驱动创新。这场变革将奖励那些深度理解技术本质并能快速适应的实践者。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 291

知识检索中的四大评估指标:准确率、精确率、召回率与F1分数详解

摘要:NLP算法面试中,评估知识检索系统的核心指标包括准确率、精确率、召回率和F1分数。准确率衡量整体预测正确性,但在样本不均衡时可能失真;精确率关注预测正类中的真实比例(查准能力),召回率衡量真实正类被预测的比例(查全能力)。F1分数是两者的调和平均,提供综合评估。这些指标通过混淆矩阵计算,并存在制约关系:提高召回率往往降低精确率,反之亦然。应用场景包括文档检索(评估结果质量和覆盖度)和文本分类(如垃圾邮件过滤)。面试需掌握指标区别、适用场景及平衡方法(如调整阈值)。F1分数在样本不平衡时比准确率更具参考

Ven%的博客 1765

C语言typeof详解

操作系统:ubuntu10.04前言: typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常广泛。一,说明 typeof的参数可以是两种形式:表达式或类型。 1,表达式的的例子: typeof(x[0](1) 这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。 如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。 以下示例声明了int类型的var变量,因为表...

木牛的博客 1万+

Python爬虫实战:5分钟抓取东方财富股票数据并保存为CSV

在投资分析与量化研究的日常工作中,获取结构化、可用的金融数据往往是第一步。对于个人投资者和量化入门者而言,如何高效获取A股全市场行情,常常面临网页动态加载、反爬机制与数据整理繁琐等挑战。本文从数据采集的基础概念出发,介绍如何利用Python这一通用编程语言,通过requests库请求财经网站公开的HTTP接口,获取返回的JSON数据,再借助pandas进行字段映射、数据清洗与表格化处理。这种方式相比传统页面解析具有响应快、结构稳定、易于批量操作的显著优势,尤其适合构建个人股票数据池、验证选股策略或进行市场情

weixin_33146151的博客 251

JavaScript typeof 判断数据类型

typeof 运算符会以字符串的形式返回数据类型,数据类型包括8大类型,number、bigint、string、 boolean、null、undefined、symbol、object

qq_42635594的博客 1941

【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07

对于光源-探测器距离 ρ, 稳态漫反射率 R(ρ) ≈ (1/(4π)) [ z₀ (μ_eff + 1/r₁) exp(-μ_eff r₁)/r₁² + (z₀ + 2z_b) (μ_eff + 1/r₂) exp(-μ_eff r₂)/r₂² ], 其中 μ_eff = √(3μ_a(μ_a+μ_s’)), z₀=1/μ_s’, z_b 与边界条件有关。通过测量光纤各点的布里渊频移 ν_B(z) 来得到应变/温度分布:Δν_B(z) = C_ν,ε Δε(z) + C_ν,T ΔT(z)。

weixin_49199313的博客 330

C#操作MySQL从入门到精通(3)——新建数据库、新建表

我们要首先新建一个数据库,并且在数据库中新建一系列的表来管理数据库。

qq_34059233的博客 951

004 C语言高级用法---typeof()关键字

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

kz01081的博客 327

流体动力学仿真软件:SU2_(3).SU2的网格生成技术

设置网格的大小、密度等参数。

kkchenjj的博客 1030

C语言高级用法---typeof()关键字***

前言 typeof() 是GUN C提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。 本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。 typeof()关键字常见用法 typeof()关键字常见用法一共有以下几种。 不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量 #include...

随意的风的专栏 1062

MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能

该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。

huanghm88的专栏 582

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言中的typeof关键字

typeof关键字是C语言中的一个新扩展。 typeof的参数可以是两种形式:表达式或类型。 下面是使用表达式的的例子:     typeof(x[0](1) 这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。 如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。 以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达

wslong的专栏 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

typeof() c语言,C语言中的typeof关键字

typeof关键字是C语言中的一个新扩展。typeof的参数可以是两种形式:表达式或类型。下面是使用表达式的的例子:typeof(x[0](1)这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo...

weixin_42255060的博客 1013

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言中typeof作用,浅析C语言中typeof关键字用法

浅析C语言中typeof关键字用法前言C语言中 typeof 关键字是用来定义变量数据类型的。在linux内核源代码中广泛使用。下面是Linux内核源代码中一个关于typeof实例:#define min(x, y) ({ \typeof(x) _min1 = (x); \typeof(y) _min2 = (y); \(void) (&_min1 == &a...

weixin_39724889的博客 1980

C语言的typeof关键字

c语言中typeof关键字,是C语言中的一个新扩展。typeof的参数可以是两种形式:表达式或类型。 下面这两个等效声明,用于声明int类弄的变量a typeof(int) a; typeof('b') a; //相当于获取'b'的类型,定义一个变量a // GCC中这个表达式的类型是int(自动提升为int), // 注意typeof(char)和typeof('b')得到的不是一样的,这个用s...

taokexia的博客 980

C语言中typeof作用,c语言中typeof关键字

为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛!下面这两个等效声明,用于声明int类弄的变量atypeof(int) a;typeof('b') a; //相当于获取'b'的类型,定义一个变量a下面用于声明指针和数组typeof(int*) p1,p2;typeof(p1) p2 //p1与p2的类型一致...

weixin_39908070的博客 1387

C语言中typeof作用,typeof关键字的作用

一、typeof详解:前言:typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常广泛。(其实这和C++的auto关键字和可以推断decltype关键字相当类似)二、实例:1,把y定义成x指向的数据类型:typeof(*x) y;2,把y定义成x指向数据类型的数组:typeof(*x) y[4];3,把y定义成一个字符指针数组:typeof(typeof(char *)[4]...

weixin_42401159的博客 2567
上一篇: 基于github搭建本地开发环境
下一篇: C语言高级用法---typeof( ((type *)0)->member )和offset_of()
sweird
博客等级 码龄20年 336粉丝 103原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值