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万+

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

y_u_yu_yu_的博客 1万+

typeof和数据类型转换

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

qq_44278908的博客 1690

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查

本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。

weixin_34046298的博客 313

C语言typeof详解

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

木牛的博客 1万+

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

JavaScript typeof 判断数据类型

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

qq_42635594的博客 1941

Android11原生设置屏幕亮由Gamma变化改为线性变化

从Android9 开始屏幕亮度调解变成非线性变化,这样的话就会出现 之前亮度变化很小,到后面时变化亮度很快; 修改为线性变化,只需要修改 ./frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache L

Android 4926

使用STM32H7点亮RGB屏幕

希望本文能对你有所帮助!RGB屏幕是一种具有红、绿、蓝三种颜色通道的显示设备,通过控制每个通道的亮度,可以显示出丰富多彩的图像和动画。要使用STM32H7控制RGB屏幕,我们需要连接适当的引脚,并编写适当的代码来控制每个颜色通道的亮度。在主循环中,我们先点亮红色通道,然后延迟一段时间,接着点亮绿色通道,再延迟一段时间,最后点亮蓝色通道,并再次延迟。需要注意的是,示例代码中的延迟循环使用了一个简单的计数器实现,但实际应用中可能需要更精确的延迟方式,例如使用定时器中断或操作系统提供的延迟函数。

QoyOle的博客 924

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

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

kz01081的博客 327

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

zheaa的博客 5750

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

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

随意的风的专栏 1062

Copilot在游戏开发中的应用:Unity脚本自动生成实践

2021年GitHub Copilot的发布,为代码自动生成带来了革命性突破。作为基于GPT模型训练的AI辅助编程工具,Copilot能根据注释、函数名、代码上下文,实时生成符合语法和逻辑的代码片段,甚至完整脚本。减少重复劳动:自动生成模板代码(如生命周期、结构),让你专注核心逻辑;降低API学习成本:对Unity特有的组件(RigidbodyAnimator)、类(),Copilot能生成符合最佳实践的调用代码;统一代码风格:通过团队共享提示词模板,让生成的代码符合项目规范;快速原型迭代。

AIGC应用创新大全的博客 1619

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C语言中的typeof关键字

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

wslong的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

weixin_42255060的博客 1013

蓝牙模块HM-10手册

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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、付费专栏及课程。

余额充值