设为首页 加入收藏

TOP

9.5 实现依赖性
2013-10-07 15:04:38 来源: 作者: 【 】 浏览:66
Tags:9.5 实现 依赖性

9.5  实现依赖性

当然,C++(www.cppentry.com)语言定义并没有陈述任何关于语言应该如何实现的问题(ARM确实给出了许多广泛用于实现的技术,但所有这些技术都不是强制要求的)。因此,那些旨在编写可移植代码的程序员应该避免依赖于某个特殊的C++(www.cppentry.com)实现的细节。

为了理解程序员为何会热衷于依赖语言的实现细节,我们考虑下面这个例子:

  1. f.c  
  2.      void f(int i){  
  3.           //...   
  4.      }  
  5.      void f(char c){  
  6.           //...  
  7.      }  
  8. main:c:  
  9.      void f(int);  
  10.      void f(char);  
  11.      int main(){  
  12.           f(0);  
  13.           f('0');  
  14.           //...  
  15.      }  

当链接这个程序的时候,main.c中每个f函数的引用都会调用定义在f.c中相应的实例。为了确保实际情况确实如此,现今所有C++(www.cppentry.com)编译器都在目标代码中,把参数类型编码(代码化)到函数的名称中。例如,C++(www.cppentry.com)实现可能会使用编码后的名字f__Fi和f__Fc分别代表f(int)和f(char)。编码化后的函数名称也会随着编译系统的不同而各不相同,甚至由于系统版本的差异也会带来一些差异。因此,对于那些依赖于这类名称编码机制的程序员,编写出来的代码将是不可移植代码。

然而,假设我们的编译器会由于创建两个f函数的定义,而变得异常低效;并且假设我们知道如何在其他的语言(如C)编写更加高效的代码;那么我们可能会用下面的C代码来取代f.c中的定义:

  1. /*c代码*/  
  2.     void f__Fi(int i){  
  3.          /*比较高效的C代码*/  
  4.     }  
  5.     void f__Fc(char c) {  
  6.          //*比较高效的C代码*/  
  7.     }  

以这种方式重写这段代码将会很快,也很简单;但遗憾的是,这段代码仍然是不可移植的。为了既得到效率又具有可移植性,我们首先要改变C函数的名称(见练习9.5),使用如下命名:
  1. /*C代码*/  
  2.      void f_int(int i){/*...*/}  
  3.      void f_char(char c)(/*...*/)  

接下来,我们改写f的C++(www.cppentry.com)定义,如下所示:
  1. extern "C" {  
  2.          void f_int(int i);  
  3.          void f_char(char c);  
  4.     }   
  5.     void f(int i){f_int(i);}  
  6.     void f(char c){f_char(c);}  

从上面可以看到,和前面一样,编写可移植代码需要花费更多的精力。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.8 运行期程序库 下一篇9.7.2 人工实例化

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: