c语言实现模板函数调用 c++模板函数调用

c语言函数调用例子

C语言中,函数调用的一般形式为:函数名(实际参数表)

吴桥网站建设公司成都创新互联公司,吴桥网站设计制作,有大型网站制作公司丰富经验。已为吴桥1000多家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的吴桥做网站的公司定做!

对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。

在C语言中,可以用以下几种方式调用函数:

1、函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。

2、函数语句:函数调用的一般形式加上分号即构成函数语句。例如:    printf ("%d",a);scanf ("%d",b);都是以函数语句的方式调用函数。

3、函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。

C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言。

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

C语言写一模板函数,求任意两个数之和,并在主函数(main)中进行显式和隐式调用

代码如下:

#include iostream

using namespace std;

// 加法的模板函数

template typename T

T Add(T a, T b)

{

return (a + b);

}

// 测试函数

int main()

{

// 显式

cout"显式调用:"endl;

int ia = 1, ib = 2, ic = 0;

ic = Addint(ia, ib);

coutia" + "ib" = "icendl;

// 隐式

cout"隐式调用:"endl;

float fa = 1.1f, fb = 2.2f, fc = 0.0f;

fc = Add(fa, fb);

coutfa" + "fb" = "fcendl;

coutendl;

return 0;

}

测试结果:

c语言如何实现函数的调用

如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:

int

WhyCoding(int

a,

float

b);

做法是,

/*

cpp_a.h

*/

extern

"C"

{

#include

"a.h"

}

/*

cpp_a.h

*/

extern

"C"

{

int

WhyCoding(int

a,

float

b);

/*

重定义所有的C函数

*/

}

从上面可以看出,extern

"C"

是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带

函数的类型信息,只包含函数符号名字,如C编译器把函数int

a(float

x)编译成类似_a这样的符号,C连接器只要

找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++

编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的

符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数

重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。

基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern

"C"

作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++

方式编译,用了extern

"C"

后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式

编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C

调用C++了).

相反,C++调用C函数,extern

"C"

的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是

_a_float来找调用函数。

在c语言中如何实现函数模板

如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求…

考虑了一阵子后,就想到了qsort上.qsort的函数原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

快排时,只要自己实现相应数据类型的比较函数cmpare就可以了.如果比较int型时,一个典型的compare函数如下:

那么,就是说可以利用void *. void *意指未指定类型,也可以理解为任意类型。其他类型的指针可以直接赋值给void *变量,但是void *变量需要强制类型转换为其它指针类型。这个相信大家都知道。那么下面以一个简单的题目为例,来探讨如何在C语言中实现模板函数。

方法1: 利用void *.

在看下面的源程序之前,需要了解几点。首先,在32位平台上,任何类型的指针所占的字节都是4个字节,因为32位机器虚拟内存一般为4G,即2的32次方,只要32位即4个字节就可以足够寻址,sizeof(void *)=4; 其次,虽然各种不同类型的指针所占的空间都为4个字节,但是不同类型的指针所指的空间的字节数却不同(这一点尤为重要,下面的程序我在开始没有调通就因为这点意识不强)。所以,如果你将一个指针强制转换为另一个类型的指针,指针本身所占的字节是不变的,但是,如果对这个指针进行运算,比如 *p,p++,p-=1等一般都是不同的。 再次,函数指针应该了解下,这里不多说。 最后,因为Sandy跟我说,C++开始的时候模板的实现其实就是利用宏替换,在编译的时候确定类型。所以,为了方便,类型也用了预编译指令#define。

span#include "stdio.h"/span

span#include "stdlib.h"/span

span//typedef int T;  //或者下面的也可以./span

span#define  T int/span

//这个FindMin是Sandy写的.felix021也写了个,差不多的就不贴出来的.

void FindMin(const void  *arr,int arr_size,int arrmembersize,int *index,

int (*cmp)(const void *,const void *b)){

int i;

*index=0;

char *p=(char *)arr;

char *tmp=p;

for (i=1;iarr_size ;i++){

if (cmp(tmp,p)0){

tmp=p;

}

p+=arrmembersize;

}

(*index)=((int)(tmp-arr))/arrmembersize;

}

*//span

可以把指针看作是char *,如果转换为int *,那下面的位移就不正确了./span

indexspan=/spanispan;/span

span}/span

span}/span

spanreturn/span indexspan;/span

span}/span

spanint/span resultspan;/spanspan//result保存的是最小值索引./span

resultspan=/spanFindMinspan(/spanarr,span12/span,

C语言怎么使用调用函数?

例子代码如下所示:

int Add(int x, int y) {    int sum;

sum = x + y;    return sum;

}void main() {    int z;

z = Add(1, 2);    printf("z=%d\n", z);

}

下面分析一下 Add函数的调用过程。

首先断点在z = Add(1, 2);处, 反汇编如下所示:

int z;

z = Add(1, 2);002C141E 6A 02                push        2  002C1420 6A 01                push        1  002C1422 E8 60 FC FF FF       call        002C1087  

002C1427 83 C4 08             add         esp,8  002C142A 89 45 F8             mov         dword ptr [ebp-8],eax

首先压入参数1和2:

002C141E 6A 02                push        2  002C1420 6A 01                push        1  

通过观察ESP可以看到参数从右到左依次入栈,ESP往低内存方向移动8字节:

ESP=0025FCCC

...0x0025FCAA  00 00 78 4c 33 00 bc fc 25 00 a9 fe aa 0f 78 4c 33 00 c8 fc 25 00 3d 5a b2 0f *** 01 00 00 00 02 00 00 00 ***0x0025FCCC  00 00 00 00

网页标题:c语言实现模板函数调用 c++模板函数调用
文章源于:https://www.cdcxhl.com/article22/hisjcc.html

成都网站建设公司_创新互联,为您提供网站维护营销型网站建设网站营销用户体验电子商务移动网站建设

广告

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

成都网站建设公司