当前位置: 首页 > news >正文

新开传奇网站大全北京网页设计公司网站

新开传奇网站大全,北京网页设计公司网站,wordpress iis伪静态,数字报网站模板一、c和c代码不兼容性分析 我们在c工程中经常会调用c工程文件或者时c库文件。这样就可能会造成c文件和c文件不兼容性而报错,造成c和c代码不兼容性的最大原因就是#xff1a;在c中有函数名重载机制#xff0c;而c中没有该机制。为了实现函数重载#xff0c;在c中通过在编译生…一、c和c代码不兼容性分析 我们在c工程中经常会调用c工程文件或者时c库文件。这样就可能会造成c文件和c文件不兼容性而报错,造成c和c代码不兼容性的最大原因就是在c中有函数名重载机制而c中没有该机制。为了实现函数重载在c中通过在编译生成.o文件的过程中做文章实际上是将函数名编译成为另一个函数名符号放在.o中因此实现了同一个重载函数在.o中是不同名的函数符号。而c程序中不存在函数重载因此.o文件中的函数名符号和.c文件中的函数名完全一致下面结合反汇编查看.o文件的方式来直观观察 test1.cint add(int a,int b){return ab;}int sub(int a,int b){return a-b;}对于test1.c这样一个c文件既可以使用gcc编译它也可以使用g编译它 1. 使用gcc方式编译并反汇编 gcc -c test1.c -o test1.o //只编译生成.o文件 objdump -d test1.o test1.i //反汇编方便查看.o文件 反汇编生成的test1.i文件如下 test1.o 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 add:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: 89 7d fc mov %edi,-0x4(%rbp)7: 89 75 f8 mov %esi,-0x8(%rbp)a: 8b 55 fc mov -0x4(%rbp),%edxd: 8b 45 f8 mov -0x8(%rbp),%eax10: 01 d0 add %edx,%eax12: 5d pop %rbp13: c3 retq 0000000000000014 sub:14: 55 push %rbp15: 48 89 e5 mov %rsp,%rbp18: 89 7d fc mov %edi,-0x4(%rbp)1b: 89 75 f8 mov %esi,-0x8(%rbp)1e: 8b 45 fc mov -0x4(%rbp),%eax21: 2b 45 f8 sub -0x8(%rbp),%eax24: 5d pop %rbp25: c3 retq 可以很直观的看出生成的.o文件中add和sub函数使用的是原来的函数名作为符号。 2.使用g方式编译并反汇编 g -c test1.c -o test1.o //只编译生成.o文件 objdump -d test1.o test1.i //反汇编方便查看.o文件反汇编生成的test1.i文件如下 test1.o 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 _Z3addii:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: 89 7d fc mov %edi,-0x4(%rbp)7: 89 75 f8 mov %esi,-0x8(%rbp)a: 8b 55 fc mov -0x4(%rbp),%edxd: 8b 45 f8 mov -0x8(%rbp),%eax10: 01 d0 add %edx,%eax12: 5d pop %rbp13: c3 retq 0000000000000014 _Z3subii:14: 55 push %rbp15: 48 89 e5 mov %rsp,%rbp18: 89 7d fc mov %edi,-0x4(%rbp)1b: 89 75 f8 mov %esi,-0x8(%rbp)1e: 8b 45 fc mov -0x4(%rbp),%eax21: 2b 45 f8 sub -0x8(%rbp),%eax24: 5d pop %rbp25: c3 retq 可以很直观的看出生成的.o文件中add和sub函数使用的已经不是原来的函数名了。分别变为了_Z3addii和_Z3subii。   小结正是因为在编译过程中c和c编译器的不同处理因此造成了c和c程序的不兼容而无法直接调用 二、c工程调用c的两种解决方式 在上面的分析得知由于编译生成.o文件的不一致导致c无法直接调用c文件或者c库(因为c库本质上就是一堆.o文件的集合)。那么有以下两种方法来解决这个问题 1在编译时对.c和.cpp文件都使用g编译。不常用 2分别使用gcc和g编译.c和.cpp文件在链接时做文章。调用C库常用 1.在编译时对.c和.cpp文件都使用g编译 要是想要使用g直接编译c文件那么一种就是直接把.c文件当成c文件编译。这样可能会造成.c文件于.cpp文件的冲突不使用。使用的还是将.c文件按照编译c文件的方式编译(也就是按照gcc方式编译),那么就需要使用到extern “C”{ }编译声明了。这个声明的就表示在{}内部的代码完全按照c程序的方式去编译和链接(即使使用的时g编译器)。需要在.c和.h文件中都使用 extern “C”{ }的方式包含.c代码段。代码实现如下 /************************test1.c***************************/ #ifdef __cplusplus extern C{ #endif//add函数定义int add(int a,int b){return ab;}//sub函数定义int sub(int a,int b){return a-b;} #ifdef __cplusplus } #endif/************************test1.h***************************/ #ifndef __TEST1 #define __TEST1#ifdef __cplusplus extern C{ #endifint add(int a,int b); // add函数声明 int sub(int a,int b); // sub函数声明#ifdef __cplusplus } #endif#endif/************************test2.cpp***************************/ #include iostream #include test1.h using namespace std; int main(void) {int a 10;int b 11;int c add(a,b);coutabcendl; } 编译g test1.c test2.cpp 生成a.out可执行文件。 执行./a.out输出ab21 编译和指向完全正确。 但是这种方式不常用因为正常我们调用的都是别人使用gcc编译好的.o文件库不会让我们自己编译源文件因此引出第二种常用的方法。 2.分别使用gcc和g编译.c和.cpp文件在链接时做文章 先使用gcc编译器编译test1.c生成test1.o文件在使用g编译test2.cpp时将test1.o链接进入。直接结合代码实现分析如下 /************************test1.c***************************/ //add函数定义 int add(int a,int b) {return ab; } //sub函数定义 int sub(int a,int b) {return a-b; } /************************test1.h***************************/ #ifndef __TEST1 #define __TEST1#ifdef __cplusplus extern C{ #endifint add(int a,int b); // add函数声明 int sub(int a,int b); // sub函数声明#ifdef __cplusplus } #endif#endif/************************test2.cpp***************************/ #include iostream #include test1.h using namespace std; int main(void) {int a 10;int b 11;int c add(a,b);coutabcendl; } 可以看出和第一种方式源码的唯一不同之处就是test1.c中没有使用extern “C”{ }编译声明了这是因为我们本就是要用gcc来编译它。但是test.h文件中还必须要extern “C”{ }声明这是因为我们在c中也必须按照c的方式要链接它。 编译gcc -c test1.c -o test1.o //仅编译test1.c生成.o文件多了的话就链接成库 g test1.o test2.cpp // 使用g编译test2.cpp时链接上test1.o 生成a.out可执行文件。执行./a.out输出ab21      编译指向完全正确第二种方式作为更普遍的c调用c文件或库的方式我们应该掌握在实际开发中我们通常会拿到一个c库文件和.h头文件比如mylib.a和mylib.h两个文件。我们要在c工程中调用他们就需要保证.h文件中使用了extern “C”{ }声明。如果.h中没有声明就代表我们不能直接使用c调用它那么我们可以有两种方法改造一是直接改造.h文件在我们的.cpp工程中直接包含#include“mylib.h”二是不改.h文件在我们的调用中使用extern “C”{ }声明包含头文件extern “C”{ #include“mylib.h”}。这两种方法的本质上都是一样的那就是我们要以c的方式调用库中的c函数。 * : 在c工程中调用c库是很常见的事情注意要点就是在.h文件中使用extern “C”{ }声明包含c库中函数的声明。另外知道我们我们在编写c工程文件的时候要按照extern “C”{ }的方式来写保不齐以后就会给c调用 原文链接
http://www.hkea.cn/news/14497538/

相关文章:

  • 建设工程造价信息网站做模板网站赚钱吗
  • 企业网站建设解决方案网站建设费可以一次性冲费用吗
  • 提供免费空间的网站企业信息查询app哪个最好
  • 建设企业网站的常见成本有哪些网站建设的平台分析
  • 公司网站用什么系统金科科技 做网站
  • 如何用wordpress快速建站自己做网站用什么数据库
  • 重庆知名网站建设免费怎么做wep网站
  • 二手书店网站建设项目规划书电子商务网站建设需要哪种语言
  • 电子商务网站建设评价论文网页游戏制作器
  • 做公司永久免费网站什么好wordpress宽屏插件
  • 网站项目建设目标网络结构分几层
  • 网站被禁止访问怎么打开wordpress 壁纸模板
  • 杏林建设网站莱芜建设银行网站
  • 网站调用flashwordpress 主页html
  • 杭州学网站建设建卖手机网站
  • php网站开发教案写代码做网站需要多好的cpu
  • 电商网站建设特色seo方案
  • 美容网站模版负面信息网站
  • 兰州网站在哪备案第三方开放平台有哪些
  • 帮客户做网站的公司深圳网站制作 论坛
  • 免费个人建站空间石家庄热搜
  • 漯河网站建设兼职做网站需要什么人
  • 沧浪企业建设网站价格网站建设开发原代码归属
  • 国际贸易网站建设WordPress做app下载
  • 安陆市网站响应式网站的原理
  • 内容分享网站设计长沙logo设计公司哪家好些
  • 网站销售系统怎么做西安关键词优化服务
  • 汽车网站建设公司网站建设及安全管理
  • 蜀都网站建设舜王上海人力资源网官方网
  • 黑豹站群系统建做网站