易截截图软件、单文件、免安装、纯绿色、仅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
语言的方式编译和连接封装函


相关文档:

串口通信(RS232的C程序)

Bioscom使用注意:串口接线方式为4,6;7,8分别短接。仅此函数要求。
否则会造成只能接受无法发送数据。函数返回值错误!
函数名:   bioscom    
  功     能:   操作port指定的RS232异步通讯口  
  用     ......

c宏定义的技巧总结


1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char      boolean;     /* Boolean value type. */
typedef ......

迅雷笔试 字符串反转 C库函数 strrev

char* my_strrev( char* string )
{
 char *left, *right, ch;
 left = right = string;
 while( *right++ != '\0');
 right -= 2;
 while( left<right )
 {
  ch = *left;
  *left = *right;
  *right = ch;
  ++left; --right;
&n ......

一道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( ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号