转:C语言中的typeof关键字

http://blog.csdn.net/wslong/article/details/7728811

typeof关键字是C语言中的一个新扩展。

typeof的参数可以是两种形式:表达式类型

下面是使用表达式的的例子:

typeof(x[0](1)

这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。

如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。

以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。

extern int foo();

typeof(foo()) var;

下面是用类型作参数的例子:

typeof(int *) a,b;

等价于:

int *a,*b;

下面是两个等效声明,用于声明int类型的变量a。

typeof(int) a; /*int类型*/

typeof(‘b‘) a; /* GCC中这个表达式的类型是int(自动提升为int),

注意typeof(char)和typeof(‘b‘)得到的不是一样的,这个用sizeof可以看出来*/

一般情况下用typeof就可以了,但是如果要于ISO C兼容的话,最好是用双下划线的形式:__typeof__。

typeof和typedef很像,事实上,只要能用typedef的地方就可以用typeof。

下面是另外一些例子:

把y定义成x指向的数据类型:

typeof(*x) y;

把y定义成x指向数据类型的数组:

typeof(*x) y[4];

把y定义成一个字符指针数组:

typeof(typeof(char *)[4] y;

这与下面的定义等价:

char *y[4];

我们再换一种定义方式:

#define pointer(T) typeof(T *)

#define array(T,N) typeof(T [N])

array (pointer(char),4) y;

如果想把T定义成一个表达式的类型,则我们仅仅用typedef无法做到

但可以通过typeof做到:

typdef typeof(expr) T;

使用typeof的声明示例

以下示例用于声明指针和数组。为了进行对比,还给出了不带typeof的等效声明。

typeof(int *) p1,p2; /* Declares two int pointers p1, p2 */

int *p1, *p2;

typeof(int) *p3,p4;/* Declares int pointer p3 and int p4 */

int *p3, p4;

typeof(int [10]) a1, a2;/* Declares two arrays of integers */

int a1[10], a2[10];

使用typeof的声明限制

请注意,typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。

例如,下列代码是无效的,因为它在typeof构造中声明了extern:

typeof(extern int) a;

下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。

extern typeof(int) b;

typeof(char * const) p = "a";

在宏声明中使用typeof

typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。因此,在没有将类型名明确指定为宏实参的情况下,构造带有所需类型的对象是可能的。

下面是一个交换两个变量的值的宏定义:

#define SWAP(a,b) {\

typeof(a) _t=a;\

a=b;\

b=_t;}

这个宏可以交换所有基本数据类型的变量(整数,字符,结构等)

参考:

http://blog.chinaunix.net/u3/101356/showart_2081601.html

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof

时间: 2024-11-06 02:54:48

转:C语言中的typeof关键字的相关文章

C语言中的register关键字

在C语言中的register修饰的变量表示将此变量存储在CPU的寄存器中,由于CPU访问寄存器比访问内存快很多,可以大大提高运算速度.但在使用register时有几点需要注意. 1.用register修饰的变量只能是局部变量,不能是全局变量.CPU的寄存器资源有限,因此不可能让一个变量一直占着CPU寄存器. 2.register变量一定要是CPU可以接受的值. 4.不可以用&运算符对register变量进行取址. 5.register只是请求寄存器变量,不一定能够成功. C语言中的registe

C语言中的static关键字

在C语言中,"static"既可用于修饰函数,也可用于修饰变量,细细总结起来有以下几个功能: 1.static修饰函数.在工程中如果包含多个源文件,声明函数时加上static则表示仅将该函数的作用范围限定于本文件,对外部源文件是不可见的. 2.static修饰局部变量.一般而言,局部变量存储于动态存储区,如果局部变量加上static修饰,则将此局部存储于静态存储区,在程序的整个生命周期都有效. 3.static修饰全局变量.同1类似,如果工程中包含多个源文件,用static声明的全局变

C语言中的volatile关键字

说明: ******一个被volatile关键字修饰的变量可能会被意想不到的改变,本意就是"易变的". ******对于被volatile修饰的变量,当编译器在编译的时候不会去假设该变量的值 ******对于被volatile修饰的变量,当优化器优化时,必须每次都小心的重新读取该变量的值,而不能使用寄存器里的备份. 使用volatile关键字的几种情况: ******第一种情况:并行设备中的状态寄存器(当不同设备访问时,状态可能会随时变化的,所以要用volatile关键字修饰) ***

C语言中的sizeof关键字

说明: ******C语言中的sizeof是一个关键字,也是一个操作符,并不是一个函数,用来计算某一变量,或数据类型所占用的内存字节数. ******sizeof有三种使用方式: ***sizeof(变量名)    (加括号) ***sizeof  变量名  (不加括号) ***sizeof(数据类型) C语言中的sizeof关键字

C语言中,static关键字作用

static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始化一次.如果没有显式初始化,默认初始化为0. #include <stdio.h> void trystat(void); int main(void) { int count; for (count = 1; count <= 3; count++) { printf("Here

对C语言中static的理解

对C语言中的static关键字的深入理解 在一次面试的时候面试官问我static全局变量与全局变量的区别,之前虽然用过但是并没仔细去搞懂他,这次来细心的学习一下. 基本概念 使用static有三种情况: 函数内部static变量 函数外部static变量 static函数 函数内部的static变量,关键在于生命周期持久,他的值不会随着函数调用的结束而消失,下一次调用时,static变量的值,还保留着上次调用后的内容. 函数外部的static变量,以及static函数,关键在于私有性,它们只属于

c语言中typeof关键字

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

C语言中的32个关键字

C语言中的32个关键字 数据类型关键字(12个) (1)     char:声明字符型变量或函数 (2)     double:声明双精度变量或函数 (3)     enum:声明美剧类型 (4)     float:声明浮点型变量或函数 (5)     int:声明整型变量或函数 (6)     long:声明长整型变量或函数 (7)     short:声明短整型变量或函数 (8)     signed:声明有符号类型变量或函数 (9)     struct:声明结构体变量或函数 (10) 

C语言中static关键字的作用

static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void msg()  {     printf("Hello\n"