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

如何在C++中调用C的代码

以前曾经总结过一篇(http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html
),关于在
C
中如何调用
C++
的代码,当时并未做完全的展开,只是简单的做了下调试,最近看到一个题目要求实现
C

C++
中代码的互相调用,其结果虽然都是通过
extern “C”
来实现
,但是具体还是有些差别的。
先对
C
中调用
C++
代码作个简单回顾:
1、             
对于
C++
中非类的成员函数,可以简单的在函数声明前面加
extern “C”
,通常函数声明位于头文件中,当然也可以将声明和函数定义一起放在
cpp

,在没有声明的情况下,直接在定义前添加
extern “C”
也可
2、             
对于
C++
类的成员函数,则需要另外做一个
cpp
文件,将需要调用的函数进行包装

以上两项的实例参看前面
C
中如何调用
C++
代码的文章。
要实现
C++
中调用
C
的代码,具体操作:
对于
C
中的函数代码,要么将
C
代码的头文件进行修改,在其被含入
C++
代码时在声明中加入
extern “C”
或者在
C++
代码中重新声明一下
C
函数,重新声明时添加上
extern “C”


通过以上的说明,我明白一点,那就是加
extern “C”
头一定是加在
C++
的代码文件中才能起作用的

 
下面分析一下这个现象的实质原因:
C
编译器编译函数时不带函数的类型信息,只包含函数符号名字,如
C
编译器把函数
int a(float x)
编译成类似
_a
这样的符号,
C
连接器只要找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是
C
编译连接器的缺点。而
C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的
a
函数可能编译成
_a_float
这样的符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么
C++
不支持采用函数返回值来区别函数重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,
C
调用
C++
,首先需要用封装函数把对
C++
的类等的调用封装成
C
函数以便
C
调用,于是
extern "C"
的作用是:让编译器知道这件事,然后以
C
语言的方式编译和连接封装函


相关文档:

ANSI C——可变参数


【原型】
      type fun( type arg1, type arg2, ...
);
【描述】
       主要用在参数个数不确定的函数中,例如:printf函数。
【使用方法】
参考:glib/manual/Add.c
#include <stdarg.h>
#include <stdio.h>
int add_em_up (int coun ......

ECLIPSE 开发 C/C++ 工程

  最近一个朋友准备把C代码在ECLIPSE上编译,以前一直搞的JAVA,也知道ECLIPSE支持C工程,但是自己从来没搞过,所以就自己先从网络上找资料,主要方法如下
1、安装JDK和Eclipse
这里就不多说,具体请见:http://blog.chinaunix.net/u/16292/showart_223309.html
我的安装环境是jdk1.5,eclipse3.2.1
2、安装C++的E ......

一道c的面试题,大数相乘

 http://www.cnblogs.com/hoodlum1980/archive/2007/08/15/857067.html
题干:输入两个较大的数,输出相乘的结果。
意思也就是两个数很大,超出了int的存储范围。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100
void GetDigits( ......

extern "C"底层原理

通常,在C语言的头文件中经常可以看到类似下面这种形式的代码:
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式 ......

C/C++ 字节对齐问题

VC中下面几个结构体大小分别是多少呢
struct MyStruct
{
    double m4;
    char m1;
    int m3;
};
struct MyStruct {
    char m1;
    double m4;
    int m3;
};
#pragma pack(push)   ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号