news 2026/8/27 12:08:07

【2015-01-18】GCC扩展关键字typeof学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2015-01-18】GCC扩展关键字typeof学习笔记

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2015-01-18| 标题:GCC扩展关键字typeof学习笔记分类:编程 / C && C++ |标签:gcc·typeof


GCC扩展关键字typeof学习笔记

    • 官方的介绍网址:
    • 参考文档:

官方的介绍网址:

【 https://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof 】

参考文档:

【 http://blog.csdn.net/npy_lp/article/details/6989676 】

【 http://blog.chinaunix.net/uid-28458801-id-4200573.html 】

以下内容来自【 http://blog.csdn.net/npy_lp/article/details/6989676 】,有删改:
关键字typeof用于获取表达式的数据类型。
简单例子,如清单1:

char*chptr01;typeof(*chptr01)ch;//等价于char ch;typeof(ch)*chptr02;//等价于char *chptr02;typeof(chptr01)chparray[5];//等价于char *chparray[5];

例子中chptr01的数据类型为char *,*chptr01的数据类型为char。
复杂的例子,如清单2:

#include<stdio.h>#definearray(type,size)typeof(type)intfunc(intnum){returnnum+5;}intmain(void){typeof(func)*pfunc=func;//等价于int (*pfunc)(int) = func;printf("pfunc(10)=%d ",(*pfunc)(10));array(char,)charray="hello world!";//等价于char charray[] = "hello world!";typeof(char*)charptr=charray;//等价于char *charptr = charray;printf("%s ",charptr);return0;}

在Linux内核中的应用,如清单3:

/* linux-2.6.38.8/include/linux/kernel.h */#definemin(x,y)({\typeof(x)_min1=(x);\typeof(y)_min2=(y);\(void)(&_min1==&_min2);\_min1<_min2?_min1:_min2;})#definemax(x,y)({\typeof(x)_max1=(x);\typeof(y)_max2=(y);\(void)(&_max1==&_max2);\_max1>_max2?_max1:_max2;})

通过typeof获得x和y的数据类型,然后定义两个临时变量,并把x和y的值分别赋给这两个临时变量,最后进行比较。另外,宏定义中(void)(&_min1 == &_min2)语句的作用是用来警告x和y不能属于不同的数据类型。

以下内容来自【 http://blog.chinaunix.net/uid-28458801-id-4200573.html 】,有删改:

一,说明
typeof的参数可以是两种形式:表达式或类型。
1,表达式的的例子:
如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。
以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。
extern int foo();
typeof(foo()) var;
2,参数的例子:
typeof(int *) a,b;
等价于:
int *a,*b;
二,实例
1,把y定义成x指向的数据类型:
typeof(*x) y;
2,把y定义成x指向数据类型的数组:
typeof(*x) y[4];
3,把y定义成一个字符指针数组:
typeof(typeof(char *)[4] y;
这与下面的定义等价:
char *y[4];

4,typeof(int \*) p1,p2; /\* Declares two int pointers p1, p2 \*/ int \*p1, \*p2; 5,typeof(int) \*p3,p4;/\* Declares int pointer p3 and int p4 \*/ int \*p3, p4; 6,typeof(int [10]) a1, a2;/\* Declares two arrays of integers \*/ int a1[10], a2[10];

三,局限
typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。
例如,下列代码是无效的,因为它在typeof构造中声明了extern:
typeof(extern int) a;

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 12:06:02

工业级EMC滤波器选型与安装:250V/6A-30A底盘安装式全解析

1. 先看这个参数组合&#xff1a;250V/6A-30A背后的行业信号 做电子设备开发和EMC整改这些年&#xff0c;我拿到一个滤波器选型需求时&#xff0c;第一反应从来不是翻datasheet对比插入损耗曲线&#xff0c;而是先想清楚一个问题&#xff1a;这设备到底工作在什么环境、过什么电…

作者头像 李华
网站建设 2026/8/27 12:05:26

超高精度运放选型与电路设计:从指标到实测的完整指南

刚把一批精密测量板从测试台撤下来&#xff0c;原因很有意思&#xff1a;电路原理完全没问题&#xff0c;但ADC采集到的数据就是波动了几十个微伏。查到最后&#xff0c;问题出在运放选型上——拿通用运放去顶一个要求0.01%精度的采样前端&#xff0c;等于拿普通卷尺去量千分尺…

作者头像 李华
网站建设 2026/8/27 12:04:11

MATLAB相关性分析实战:Pearson、Spearman、Kendall系数选型与避坑指南

1. 项目概述&#xff1a;相关性分析在数模竞赛中的核心地位数模竞赛搞了这么多年&#xff0c;每次看到队伍一上来就闷头建复杂模型&#xff0c;却对数据本身的关系视而不见&#xff0c;我就觉得特别可惜。相关性分析&#xff0c;这个听起来基础到甚至有些“老土”的步骤&#x…

作者头像 李华
网站建设 2026/8/27 12:01:54

有赞Android实习五面都挂了,复习半月再战,转拿腾讯offer

缘起 为了有赞的面试准备了半个月的样子&#xff0c;当时还投了美团、字节、滴滴、京东&#xff0c;目的只有一个&#xff0c;就是要进大厂&#xff0c;但是只有有赞扛过了一面&#xff0c;其他都是一面就挂了。 前三面都自我感觉良好&#xff0c;以为能稳拿offer的&#xff0c…

作者头像 李华