C的动态类型检查

这次美国之行的一大收获就是终于正视了Objective-C而不再只是当它是不顺手的工具了。这主要是有机会拜读了Brad Cox的《Objective-Oriented Programming, an evolutionary approach》。今天就谈谈它第91页提到的那个极少C程序员甚至C编译器作者知道的一个极为馄饨的语法:

 
 
 
  1. struct MYSTRUCT someVariables; 
  2. someVariable = (*((struct MYSTRUCT *)(*)() _msg))(someObject, …); 

C语言是静态类型检查的编译语言.例如下面程序定义和使用了两个类型:浮点和定点。

 
 
 
  1. #include  
  2.  
  3. typedef struct { 
  4.     float x, y; 
  5. } FloatingPoint; 
  6.  
  7. typedef struct { 
  8.     int x, y; 
  9.     int scale; 
  10. } FixedPoint; 
  11.  
  12. int main() { 
  13.     FloatingPoint flo; 
  14.     FixedPoint fix; 
  15.     printf("(%f,%f)\n", flo.x, flo.y); 
  16.     printf("(%f, %f)\n", 1.0*fix.x/fix.scale, 1.0*fix.y/fix.scale); 

不同类型间的转换需要cast,否则编译时会被警告。后门还是有的,就是void *类型。我们声明id是此void *类型,加入一个使用它的迷你函数:

 
 
 
  1. typedef void *id; 
  2.  
  3. id thePoint(id thePoint) { 
  4.     return thePoint; 

这样在main里我们可以使用明确的类型转换,不会被警告:

 
 
 
  1. id flid = thePoint(&flo); 
  2. printf("(%f,%f)\n", ((FloatingPoint *)flid)->x, ((FloatingPoint *)flid)->y); 

但类型错了也没了警示报告:

 
 
 
  1. FloatingPoint *flip = thePoint(&fix); 
  2. printf("(%f,%f)\n", flip->x, flip->y); 

我们试着改写为间接的函数指针类型,当然也没有编译预警:

 
 
 
  1. id (*thePointPointer)(id); 
  2. thePointPointer = &thePoint; 
  3.  
  4. flip = thePointPointer(&fix); 
  5. printf("(%f,%f)\n", flip->x, flip->y); 

但如果我们加入明确类型,就会看到预期的警示,虽然是有些啰嗦:

 
 
 
  1. FloatingPoint *(*theFloatingPointPointer)(FloatingPoint *); 
  2. theFloatingPointPointer = &thePoint; 
  3.  
  4. flip = theFloatingPointPointer(&fix); 
  5. printf("(%f,%f)\n", flip->x, flip->y); 

但这很容易解决,写在一行就行了:

 
 
 
  1. FloatingPoint *flop = ((FloatingPoint *(*)(FloatingPoint *))&thePoint)(&fix); 

我想这就是书中提到的意思。Objective-C是超级的C语言,这些馄饨都被精心的包装成了简洁的语法。带类型检查的动态语言 —— 我喜欢。

原文链接:http://www.ituring.com.cn/article/48062

网页标题:C的动态类型检查
新闻来源:http://www.csdahua.cn/qtweb/news44/367844.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网