C的动态类型检查

开发 开发工具
这次美国之行的一大收获就是终于正视了Objective-C而不再只是当它是不顺手的工具了。这主要是有机会拜读了Brad Cox的《Objective-Oriented Programming, an evolutionary approach》。

这次美国之行的一大收获就是终于正视了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 <stdio.h> 
  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

责任编辑:陈四芳 来源: 图灵社区
相关推荐

2009-02-03 09:33:26

动态类型动态编程C# 4.0

2023-01-05 08:09:27

GroovyDSL​

2011-08-22 09:34:50

Objective-C多态动态类型

2021-06-09 07:55:19

Typescript类型检查

2009-08-12 16:01:32

C#动态改变数据

2009-07-02 10:07:24

C# 4.0的动态类型Visual Stud

2023-01-06 08:06:52

Groovy类型扩展

2022-12-30 08:08:30

2021-06-05 21:30:24

typescriptOverride检查

2019-08-12 11:40:48

数据库SQLite3数据类型

2013-12-23 09:48:43

C++锁定模式

2015-04-02 16:23:50

C++内存泄露检查

2010-01-28 13:45:06

C++数组

2012-07-02 10:43:49

JVMGroovyJava

2009-08-27 16:39:26

C# String类型

2024-04-12 12:36:06

JSJavaScrip方式

2014-11-25 10:18:17

Objective-C

2009-09-02 10:58:02

C#动态数组

2022-01-10 10:48:34

SorbetVS CodeRuby

2009-09-17 18:07:22

C#动态数组
点赞
收藏

51CTO技术栈公众号