导航:首页 > 源码编译 > c代码调用c库编译问题

c代码调用c库编译问题

发布时间:2023-05-18 00:10:49

1. 关于C++成语中调用C的库函数问题

extern “C“ 是用来提示编译器用c的库文件来编译这个cpp文裤迟氏件的,这是为了c++可支持旦码c的类库设计的。 你都测试过了,编译加上extern “C"和不加extern “C”生成的函数名是不同的,加上是c的方式,不加胡散是c++的方式。

2. 如何在C++中调用C程序

如果引用多个,那么就如下所示
extern “C”{
#include “ s.h”
#include “t.h”
#include “g.h”
#include “j.h”};
然后在调用这些函数之前段前,需要将函数也全部声明一遍。2.
C++调用搏枝C函数的方法,将用到的函数全部重新声明一遍
extern “C”{
extern void A_app(int);
extern void B_app(int);
extern void C_app(int);
C++语言支持函数重载,C语言不支持函数重载。函数被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。

3. c文件中调用c++编写的jlibrtp库时,不能编译通过,但是单独编译一个cpp文件能编译通过,相同的编译器。

无论如何,点是C + +支持函数重载,编译obj或里面的库文件,将耦合的签名和参数来区分不同功能的函数参数的同名函数名。然而,C语言不支持重载,所以有没有这样的函数名签名。
在这种方式中,C语言程序调用C + +编写的库,你唤桥不会找到一个函数。

例陵链雹如,一个函数调用无效foo的(INT酒吧)之类的,可能是在C + +编译器调用类的的名字foo_i,会被编译成富里面的c语言,如c语言程序找到富不会被发现,所以连接是错误的。函数名不会
要解决这尺帆个问题,引入EXTRN“C”{},C + +的加参数签名的范围,并保持统一的标准c语言,c语言兼容计划。

4. 在c++中调用c的函数库,请问这个怎么处理编译器报错

<cctype>这种形式的C头文件中的函数名称放在std命名空间中.
using namespace std;导入std命名空间中所有名称到当前全局,没有错误。
是语法错误,有两句可以改正为:
cout << "a" << (isalpha(a) ? "是英文字母" : "不是英文字母");

因为条件(三目运算)表达式相当于if-else.但要注意if-else属于语句,而条件表达式属于表达式,表达式的一个特征是有一个值蔽饥模.它可以用在其它表达式肢兄能用的所有地方.条件表达式宏缓的语法:
cond-exp ? a : b
a和b必须是个表达式,两者之一是条件表达式的值.a和b的类型要相同(如都是整数),如果类型不同,结果由类型转换规则决定.如果转换不了(例如a是字符串,而b是整数)就编译错误.

5. 如果C++程序要调用已经被编译后的C 函数,该怎么办

由于编译后的名字不同,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。

6. c语言调用其他文件的函数怎么编译

调用函数库的话用#include<XXX.h>或者#include"XXX.h"区别是你库文件放在同一个文件夹还是在IDE的安装目录下面,如果你库文件在你工程文件夹里面用#include<XXX.h>,否则用#include"XXX.h"

如果你说自己写库的话是需要两个宏命令,#ifndef_XXX_H#define_XXX_H,然后你函数名用extern表示

如果你说编译的话,你应该说的是编译原理吧,你可以反汇编一下一个编译好的程序,如果该处编译了一个其他函数库的函数,你可以看到程序把参数PUSH到内存后CALL或者LCALL了一个这个函数的地址,这就完成了汇编中调用函数的部分,我记得X86里面CALL的机器码是E8H吧,有兴趣的话可以自己用反汇编看一下

这个CALL的话就是调用函数的功能

7. 以及为什么在C++中调用C语言编译的函数时

1、一个函数(function)是一个可以从程序其它地方调用执行的语句块。以下是函数定义格式:
type name ( argument1, argument2, ...) statement
说明:
type 是函数返回的数据的类型
name 是函桐岩数被调用时使用的名
argument 是函数调用需要传入的参量局孙御(可以声明任意多个参量)。每个参量(argument)由一个数据类型后面跟一个标识名称组成,就像变量声明中一样(例如,int x)。参量仅在函数范围内有效,凯拍可以和函数中的其它变量一样使用, 它们使得函数在被调用时可以传入参数,不同的参数用逗号(comma)隔开.
statement 是函数的内容。它可以是一句指令,也可以是一组指令组成的语句块。如果是一组指令,则语句块必须用花括号{}括起来,这也是我们最常见到情况。其实为了使程序的格式更加统一清晰,建议在仅有一条指令的时候也使用花括号,这是一个良好的编程习惯。
2、示例:每一个C语言程序有且只有一个main函数,本身main就是一个函数。

int main()
{
return 0;
}

8. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明

总之,重点就是C++里面支持函数的重载,因此编译出来的.obj或者库文件里面,函数名会兆山枝被加上和参数有关的签名,用来区分同样函数名参数不同的函数。然而C语言唯穗不支持重载,所以函数名里面没有这样的签名。
这样,当C语言的程序调用C++写成的库的时候,就会找不到函数。
比如,一个函数叫 void foo(int bar)之类的,可能会在c++编译成叫 foo_i之类的名字,而在c语言里面就会编译成foo,这样c语言的程序去找foo就会找族敏不到,这样连接的时候会出错。
为了解决这个问题,引入了extrn "c"{},在这个的作用域之内,c++的函数名不会加上参数签名,和c语言的标准保持统一,就兼容c语言的程序了。

9. 如何解决C和C++互相调用的问题

在实际工作中可能经常要进行C和C++的混合卖侍编程,C++调用C语言的代码通常都比较容易,但也有一些细节需要注意。C要调用C++的代码就略为麻烦一些,因为C不支持面向对象的特征。 1,首先我们来看一下C++调用C语言的代码。要让你的C代码既能被C代码又能被C++调用虽说容易,但是还是有需要注意的地方。现有三个文件分别如下:[cpp]#ifndef TESTC_H#defineTESTC_H#ifdef__cplusplus //2个下划线extern"C"{#endifintadd(inta, intb);#ifdef__cplusplus}#endif#endif[cpp]#include "TestC.h"intadd(inta, intb){return(a+b);}[cpp]#include#include"TestC.h"intmain(){printf("add=%d\n" ,add(2,5));return0;}说明: file TestC.h是C的头文件,file TestC.c是其实现文件,file TestCpp.cpp是调用C函数的C++文件。文件TestC.h中的TESTC_H定义是为了头文件保护,”#ifdef__cplusplus ”这个不能缺少,你可以去查看C的标准库头文件中都有这个,如”stdio.h”。有了这个宏编译器就知道现在是C还是C++在调用它。 C编译器编译后在符号库中的名字为_add,而C++编译器则会产生像_add_int_int之类的名字。C++正是依靠这种机制实现了函数的重载。 extern关键字表示将函数或变量声明为全局类型,与之相对应的是static。static限定函数或变量的作用域为本文件。extern还有一个作用就中斗吵是与”C”连在一起使用,即extern“C”通知编译器将extern “C”所包含的代码按照C的方式编译和链接。 intb){return(a+b);}}; 将C++类封装为C函数的文件(为了简略也将声明和实现放在了同一个文件中)如下:[cpp]#include"TestClass.h"extern"C"intadd_cpp(inta, intb);intadd_cpp(inta, intb){ADDs;return s.add(a,b) ;} 实际调用C++代码的C文件如下:[cpp]#includeexternintadd_cpp(inta, intb);intmain(){printf("add_cpp=%d\n" ,add_cpp(2,5));return0;} 上面的过程很清晰,就是用一个函数将C++类的使用封装起来,然后将它外部声明为C函数就可以了。文件TestClass.h定义并实现了一个类,该类只有一个add方法。文件TestCpp.cpp定义并实现了一个函数add_cpp,函数中定义了一个HJH类对象并调用了该对象的add方法。然后将add_cpp函数进行外部声明为C。 TestC.c文件中销行为了使用add_cpp函数,也需要进行外部声明。这是为了通知编译器说明这个函数是在其他文件中实现(注意在C文件中的extern后面不可加”C” )。

阅读全文

与c代码调用c库编译问题相关的资料

热点内容
液压油可压缩吗 浏览:944
源泉cad加密文件 浏览:125
银河v10驱动重编译 浏览:889
电脑上文件夹右击就会崩溃 浏览:689
右美维持算法 浏览:938
php基础编程教程pdf 浏览:219
穿越之命令与征服将军 浏览:351
android广播重复 浏览:832
像阿里云一样的服务器 浏览:318
水冷空调有压缩机吗 浏览:478
访问日本服务器可以做什么 浏览:434
bytejava详解 浏览:450
androidjava7 浏览:386
服务器在山洞里为什么还有油 浏览:887
天天基金app在哪里下载 浏览:975
服务器软路由怎么做 浏览:293
冰箱压缩机出口 浏览:229
OPT最佳页面置换算法 浏览:645
网盘忘记解压码怎么办 浏览:853
文件加密看不到里面的内容 浏览:654