㈠ 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语言是怎么进行函数调用的
每一个函数调用都会分配函数栈,在栈内进行函数执行过程。调用前,先把返回地址压栈,然后把当前函数的esp指针压栈。
㈢ c语言中怎么调用自己定义的函数
在使用一个函数之前必须先对他进行声明:
//void B();声明B函数的存在。void A(){B();//非法,程序执行到此时并不知道B函数的存在。}void B(){}
或者
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int fa(int n)
{
int a;
for(a=2;a<=sqrt(n*1.0),n%a!=0;a++);
if(a>sqrt(n*1.0))
return(1);
else
return(0);
}
void main( )
{
int n,q;
scanf("%d",&n);
(3)c的方法怎么调用扩展阅读
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int fa(int n)
{
int a;
for(a=2;a<=sqrt(n*1.0),n%a!=0;a++);
if(a>sqrt(n*1.0))
return(1);
else
return(0);
}
void main( )
{
int n,q;
scanf("%d",&n);
if(fa(n)==1)
printf("n");
else
printf("y");
system("pause");
exit(0);
}
㈣ C语言中方法的调用问题
定义了一个简单的函数func1, 调用的时候只需要"函数名()" 的方式就可以调用的到。(至于调用的过程是如何处理的,就要参考汇编的知识了。)
但是,在实际的开发过程中可能会遇到这种情况, 函数名事先并不确定,函数名是通过一个字符串变量保存的,这种状况该如何调用呢?
更具体一点的例子,函数名是通过外部输入进去了。
该如何执行func1呢?
解决以上问题之前, 首先引入函数指针的概念。
在C语言中,某一数据变量的内存地址可以存储在相应的指针变量中,比如 int * , char * 等,
对于函数来说,也同样如此,函数的首地址也可以存储在某个函数指针变量里,通过这个函数指针变量我们就可以调用所指向的函数了。
如何定义函数指针变量? 很简单。
对应到上面 func1 函数,可以定义如下的指针变量。
void (*funcP)()
funcP这个名字可以随便取。
/************************
* add by oscar999
************************/
func1()
{
printf("this is func1!\n");
}
void main()
{
void (*funcP)();
funcP = &func1;
(*funcP)();
}
有了如上的例子,不难想到:
如果事先定义一些函数指针,通过传入的函数名字串,得到相应的函数指针,就可以实现函数调用了。
[cpp] view plainprint?
/************************
* add by oscar999
************************/
#include <stdio.h>
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
funcP getFuncPointer(char* sfuncname)
{
if(strcmp(sfuncname,"func1")==0)
{
return &func1;
}else if(strcmp(sfuncname,"func2")==0){
return &func2;
}
return NULL;
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
funcp = getFuncPointer(c);
if(funcp!=NULL)
{
(*funcp)();
}
}
/************************
* add by oscar999
************************/
#include <stdio.h>
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
funcP getFuncPointer(char* sfuncname)
{
if(strcmp(sfuncname,"func1")==0)
{
return &func1;
}else if(strcmp(sfuncname,"func2")==0){
return &func2;
}
return NULL;
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
funcp = getFuncPointer(c);
if(funcp!=NULL)
{
(*funcp)();
}
}
你可能会想,通过传入的string 直接调用对应的function不就可以了吗?类似:
[cpp] view plainprint?
/************************
* add by oscar999
************************/
#include <stdio.h>
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
if(strcmp(c,"func1")==0)
{
func1();
}else if(strcmp(c,"func2")==0){
func2();
}
}
/************************
* add by oscar999
************************/
#include <stdio.h>
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
if(strcmp(c,"func1")==0)
{
func1();
}else if(strcmp(c,"func2")==0){
func2();
}
}
以上这种对于 function 较少的状况可以使用, 但是func很多的话, 或者动态的生成这部分的话,指针函数的方式就很好了。
函数名字串和函数指针放到一个name value set 中去, 这样就可以很容易得到函数指针了。
㈤ c语言中函数调用有三种方法,能帮忙各举个例子吗
1、首先在打开的C语言数据库中,输入【#include】,如下图所示。
㈥ 计算机c语言中函数之间如何调用
函数要先声明,后调用,如:
#include<stdio.h> //包含头文件,头文件中含有一些函数的定义,包含它,相当于已经声明了下面的Printf函数
int main()//主函数
int sum(int x,int y) //在调用前要先声明,声明可以先不定义函数体,也可以在声明的同时定义函数体
//int sum(int x,int y)
//{
// return x+y;
//}
void main()
{
int a=3,b=4,c;
c=sum(a,b);
printf("计算结果是:%d",c);
}
int sum(int x,int y) //定义声明的函数
{
return x+y;
}
㈦ C语言函数调用的三种方式并分别举一例。
1、值传递,创建变量x和y,x的值等于a的值,y的值等于b的值
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d/n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf(“a=%d,b=%d/n”,a,b)
}
2、地址传递,相当于建立了px和py两个指向整型的指针,其值分别为a和b的地址
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d/n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2(&a,&b);
Print(“a=%d,b=%d/n”, a, b);
}
3、引用传递,x和y直接引用a和b,对a和b操作,相当于给a、b起了别名x、y
Exchg2(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d/n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(“a=%d,b=%d/n”, a, b);
}
printf用法:
printf()函数的调用格式为:printf("<格式化字符串>",<参量表>)。
其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。
参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。
比如:
int a=1234;
printf("a=%d ",a);
输出结果为a=1234。
㈧ C语言如何调用函数
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
#include<stdio.h>
intfun(intx,inty);//函数声明,如果函数写在被调用处之前,可以不用声明
voidmain()
{
inta=1,b=2,c;
c=fun(a,b);//函数的调用,调用自定义函数fun,其中a,b为实际参数,传递给被调用函数的输入值
}
//自定义函数fun
intfun(intx,inty)//函数首部
{//{}中的语言为函数体
returnx>y?x:y;//返回x和y中较大的一个数
}
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。
这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。
图表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
㈨ c语言中怎么调用函数
函数分为库函数和自定义函数,在调用库函数时只要标明头文件(所谓头文件就是一个东西,里面包括了一些函数各声明之类的,当你要调用它中的函数时就就得先向程序说明你要调用这个文件里的函数,否则有有侵权行为哦)可以在主调函数中调用这个头文件里的所有函数了,例如头文件为#include<stdio.h>你就可以在主调函数中调用这个头文件里的函数:
main
{ printf("haha");/*这时main函数为主调函数,printf为被调函数*/
}
调用自定义函数时其实和调用库函数一样的,只不过这个函数是你自己定义的,再如:
main
{ void f();/*声明 f()函数*/
f(); /*调用f()函数*/
}
f()
{
printf("haha");/*f()函数调用库函数*/
}