typeof()关键字
typeof是GNU c标准的关键字。
typeof()的作用是自动推导出括号中表达式的数据类型。
#include <stdio.h> void func1(void)
{
int a = ;
typeof(int *)pa = &a;//pa的数据类型为int型的指针 printf("pa:\t%p\n", pa);
printf("&a:\t%p\n", &a);
printf("a:\t%d\n", a);
printf("*pa:\t%d\n", *pa);
} void func2(void)
{
int b = ;
typeof(&b)pb = &b;//&b的数据类型为int*,所以pb的类型为int*。 printf("pb:\t%p\n", pb);
printf("&b:\t%p\n", &b);
printf("b:\t%d\n", b);
printf("*pb:\t%d\n", *pb);
} void func3(void)
{
int* pc = NULL;
typeof(*pc) c = ;//pc的类型为int*,那么,*pc的类型即为int
printf("c=%d\n",c);
} void func4(void)
{
int i = ;
int* pc = NULL;
typeof(*pc) arr[] = {,,,};//同样,*pc的类型为int
for(i = ; i < ; ++i)
printf("arr[%d]=%d\n", i, arr[i]);
} void func5(void)
{
int i = ;
typeof(typeof(const char *)[]) pchar = {"hello", "world", "good", "night"};
//里层typeof的类型为const char*,和外层结合后,pchar的数据类型即为const char*指针数组
for (i = ; i < ; i++)
printf("pchar[%d]:%s\n", i, pchar[i]);
} int add(int param1, int param2)
{
return param1 + param2;
} int sub(int param1, int param2)
{
return param1 - param2;
} int mul(int param1, int param2)
{
return param1 * param2;
} void func6(void)
{
int (*func[]) (int, int) = {add, sub, mul};//显然func的数据类型为函数指针数组,数组元素为函数指针。 typeof(func[](, )) sum = ; //func[0](1,1)===>add(1,1)===>2,即 typeof(2)sum = 100;
typeof(func[](, )) dif = ;
typeof(func[](, )) pro = ; printf("sum:%d\n", sum);
printf("dif:%d\n", dif);
printf("pro:%d\n", pro);
} #define pointer(T) typeof(T *)
#define array(T, N) typeof(T[N]) void func7(void)
{
int i = ;
array(pointer(char), ) pchar = {"hello", "world", "good", "night"};
for (i = ; i < ; i++)
printf("pchar[%d]:%s\n", i, pchar[i]);
} //from linux-3.5/include/linux/kernel.h
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void)(&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; }) int main(int argc, char** argv)
{
int a = ;
//char b = 2;
int b = ;
func1();
func2(); (void); printf("%d\n",min(a,b));
func3();
func4();
func5();
func6();
func7(); return ;
}
附加知识点:
line 92包含两个知识点,
1.warning: statement with no effect
c语言中语句(statement)的用法,
正如104行,如果是 "12;"gcc编译时加上-Wall参数(高版本gcc可能不会报警告),会报warning: statement with no effect,即无效的语句。
2.warning: comparison of distinct pointer types lacks a cast
如果将106行中的b的数据类型改为char,编译时就会报出警告。
(&_min1 == &_min2);通过这种方式可以判断两个变量的类型是否一致。
typeof()关键字的更多相关文章
- typeof关键字简介 -rtti
typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ...
- typeof关键字的作用
http://blog.chinaunix.net/uid-28458801-id-4200573.html 一.typeof详解: 前言: typeof关键字是C语言中的一个新扩展,这个特性在 ...
- typeof关键字
C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 使用方法 1.当x的类型为是 int 时 _min1变量的数据类型则为 int. 2.当x为一个表达式时(例 ...
- c语言中typeof关键字
为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量atypeof ...
- C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)
一.问题描述 java有反射机制,C#也有反射机制,在C#中typeof关键字用于获取类型的System.Type对象,该对象的GetMethods()方法可以得到类型中定义的方法对象的计集合,调用方 ...
- TypeScript 0.9.1 发布,新增 typeof 关键字
TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...
- 023使用typeof关键字获取类内部结构
private void button1_Click(object sender, EventArgs e) { Focus(); string a=txtType.Text; // Type typ ...
- linux内核宏container_of前期准备之gcc扩展关键字typeof
typeof基本介绍 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会 ...
- C语言typeof详解 offsetof
http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言: typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...
随机推荐
- 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...
- 打印不同的数 Exercise07_05
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:打印不同的数 * */ public class Exercise07_0 ...
- [转]iOS ARC机制 weak strong
写在开头 虽然距离WWDC2011和iOS 5已经快一年时间,但是很多开发者并没有利用新方法来提高自己的水平,这点在ARC的使用上非常明显(特别是国内,基本很少见到同行转向ARC).我曾经询问过一些同 ...
- Linux发布Tomcat Web项目
1.打包项目,项目右键–>Export –> WAR file 2.将.war文件放到tomcat下的webapps下.重启tomcat即可. ps afux — 查看进程 ki ...
- Error:Execution failed for task ‘:app:processDebugManifest’.
Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attribute ...
- Java集合迭代器 Iterator分析
简介 迭代器是遍历容器的一种常用方法,它屏蔽了容器的实现细节,无需暴露数据结构内部,就可以对容器进行遍历,迭代器本身也是一种设计模式,迭代是一种特殊的遍历方式. Iterator 在java中,迭代器 ...
- DevExpress.Build.targets
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask ...
- B3:状态模式 State
当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决当控制一个对象状态转换条件表达式过于复杂时的情况,把状态判断逻辑移到表示不同状态的一系列类中.如果状态判断很简单, ...
- hdu1698 Just a Hook (线段树区间更新 懒惰标记)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI
Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...