C++动态联编-函数指针

来源:互联网 发布:知乎话题怎么添加 编辑:程序博客网 时间:2024/06/05 07:50
在C++编译时,对于常规的函数调用,编译器在函数的调用出插入函数的相对地址,程序运行时可以有函数的相对地址计算出函数的绝对地址,这样函数可以被正确调用。这种在编译时就确定函数地址的联编过程叫做静态联编。动态联编是指在程序编译时,编译器并不知道函数的相对地址,调用函数的相对地址只有在程序运行时才能确定。例如在如下示例中的DisplayNumber()函数体内,编译器并不知道DisplayFormat(Number)调用的函数地址,真正的地址是在运行时通过实参传入的。




//示例2.1中定义了一个通用函数:void DisplayNumber(DISPLAYINTEGER DisplayFormat,const int Number)
//其功能是以各种格式显示整形数字。只要传递适当的实参,该函数就能很好工作。
//如果客户需求发生变化,例如增加二进制格式的输出,只要增加相应的功能函数。
// void DisplayBinary(const int Number)即可。通用函数不必改动。
//显然,函数指针DISPLAYINTEGER给该函数增添了灵活性,得以通用。
//这得益于C++的动态联编功能,而函数指针不过是该功能的一种应用形式。


#include "stdio.h"
#include "stdlib.h"

//定义函数指针类型DISPLAYINTEGER,只想返回值为void,参数列表为(const int)的函数
typedef void (*DISPLAYINTEGER)(const INT);

//定义函数,将数字以十进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayDecimal(const int Number)
{
     printf("The decimal value is %d\n",Number);
}
//定义函数,将数字以八进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayOctal(const int Number)
{
     printf("The octal value is %o\n",Number);
}
//定义函数,将数字以十六进制形式输出,该函数类型与DISPLAYINTTEGER匹配
void DisplayHexadecimal(const int Number)
{
     printf("The hexadecimal value is %x\n",Number);
}
/************************************************************************************
定义通用的显示数字函数        
DisplayFormat           DISPLAYINTEGER函数指针类型,实参可以是以上定义的
                        3个函数之一。通过传递不同的实参,将数字以各种格式输出
Number                  准备输出的数字
************************************************************************************/
     void DisplayNumber(DISPLAYINTEGER DisplayFormat,const int Number)
     {
          //调用以实参传入的函数,以某种格式输出整形数字
          DisplayFormat(Number);
     }

int main(int argc,char* argv[])
{
     int Number=0;

     //如果有数字形式的命令行参数,将其输出,否则输出0
     if(argc>1)
        Number=atoi(argv[1]);
     //分别以3种格式将数字输出
     DisplayNumber(DisplayDecimal,Number);
     DisplayNumber(DisplayOctal,Number);
     DisplayNumber(DisplayHexadecimal,Number);

     return 0;
}


命令行
vitual.exe 50
的输出结果:
The decimal value is 50
The octal value is 62
The hexadecimal value is 32
原创粉丝点击