zoukankan      html  css  js  c++  java
  • 重载是如何实现的?

    转自:《高质量C/C++编程指南》 

    几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素: 参数与返回值。

    如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:

          void Function(void);

          int Function (void);

      上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数:

          int x = Function ();

      则可以判断出 Function 是第二个函数。问题是在 C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。所以只能靠参数而不能靠返回值类型的不同来区分重载函数。

    编译器根据参数为每个重载函数产生不同的内部标识符。

    例如编译器为示例 8-1-1 中的三个 Eat 函数产生像_eat_beef、_eat_fish、_eat_chicken 之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。

     

            如果 C++程序要调用已经被编译后的 C 函数,该怎么办?
            假设某个 C 函数的声明如下:

          void foo(int x, int y);

            该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能
    直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。
            例如:
        extern “C”
        {
            void foo(int x, int y);
            ... // 其它函数
        }
            或者写成
        extern “C”
        {
            #include “myheader.h”
            ... // 其它 C 头文件
        }


            这就告诉 C++编译器,函数 foo 是个 C 连接,应该到库中找名字_foo 而不是找_foo_int_int。C++编译器开发商已经对 C 标准库的头文件作了 extern“C”处理,所以我们可以用#include 直接引用这些头文件。

     

     

     本文转自CSDN:http://blog.csdn.net/jubincn/article/details/7300141

  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/gongxing/p/4672875.html
Copyright © 2011-2022 走看看