易截截图软件、单文件、免安装、纯绿色、仅160KB

用C++调用C的库函数(转)

 用C++调用C的库函数
  C++调用C的库函数时,如果头文件定义得不恰当,可能会出现明明某函数在obj文件中存在,但是却发生链接失败的情况,出现如下错误:
  
  undefined reference to 'xxx'
  出现问题的原因是c库函数编译成obj文件时对函数符号的处理和C++不同。因为C++函数支持重载,所以函数符号的处理要更复杂一些,c往往不作修饰。
  例如有函数:
/* dofunc.c */
#include <stdio.h>
int dofunc()
{
        printf("dofunc\n");
}
  使用gcc编译成obj后
gcc -c dofunc.c
#生成 dofunc.o
objdump -x dofunc.o
[    0](sec -2)(fl 0x00)(ty     0)(scl 103) (nx 1) 0x00000000 dofunc.c
File
[    2](sec    1)(fl 0x00)(ty    20)(scl     2) (nx 1) 0x00000000 _dofunc
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
[    4](sec    1)(fl 0x00)(ty     0)(scl     3) (nx 1) 0x00000000 .text
AUX scnlen 0x14 nreloc 2 nlnno 0
[    6](sec    2)(fl 0x00)(ty     0)(scl     3) (nx 1) 0x00000000 .data
AUX scnlen 0x0 nreloc 0 nlnno 0
[    8](sec    3)(fl 0x00)(ty     0)(scl     3) (nx 1) 0x00000000 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 10](sec    4)(fl 0x00)(ty     0)(scl     3) (nx 1) 0x00000000 .rdata
AUX scnlen 0x8 nreloc 0 nlnno 0
[ 12](sec    0)(fl 0x00)(ty    20)(scl     2) (nx 0) 0x00000000 _printf
  
  c的dofunc函数在obj文件里的符号为 _dofunc
  
  再看看使用g++编译后的代码:
 
g++ -c dofunc.c
objdump -x dofunc.o
SYMBOL TABLE:
[    0](sec -2)(fl 0x00)(ty   &


相关文档:

C/C++ static和可重入概念

static
C++中的static
  C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
  一、面向过程设计中的static
  1、静态全局变量
  在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变 ......

清理C盘大攻略——立即见效


1.打开“我的电脑”-“工具”-“文件夹选项”-“查看”-在“显示所有文件和文件夹”选项前打勾-“确定” 
2.删除以下文件夹中的内容: 
x:\\Documents and Settings\\用户名\\Cookies\\下的所有文件(保留index文件) 
x:\\Documents and S ......

C: 面向对象(3)

以下代码演示如何用C来模拟多态。gcc版本:3.4.4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#ifndef class
        #define class struct
#endif
#ifndef private
        ......

C/C++指针

最近工作不紧,抽空看了下C、C++的指针,发现了一些平时没注意到的指针用法和问题。
1、指针引用
void func1(MYCLASS* &pBuildingElement);
乍一看,怪怪的,看了下解释,细想一下和指针的指针类似:
void func1(MYCLASS** pBuildingElement);
看下面的例子:
...
MyClass* p = new MyClass;
func1(p);
......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号