C++-(二)C++和C的相互调用

C++和C的相互调用

C++对C代码的调用

C++编译器和C编译器的编译方式是不同的,同时C++编译器能够兼容C语言的编译方式,但是C++编译器会优先使用C++的编译方式。

  • (1)怎么在c++代码中调用的c程序呢?并且能使C++编译器可以指定C编译方式进行编译呢?
    答:extern关键字:能强制让C++编译器按照C语言的编译方式进行编译{指定C代码块}。
C++编译器编译时,指定{}内的内容要用C语言方式编译
extern "C"
{
	C代码块;注意:此代码块中不能出现重载函数。
}
  • (2)如何保证C代码只会以C的方式被编译?
    答:此时不能再用extern关键字,因为extern "C"{ }是C++编译器能识别的语法,不是C语法,C编译器不支持,编译时会出错。

  • (3)那么可能有没有一种既可以支持按照C++编译方式编译,也可以按照C编译方式编译的语法呢?
    答:__cplusplus是C++编译器内置的标准宏定义(C语言编译器内部是没有这个宏的),其作用:确保C代码以统一的C方式编译成目标文件
    语法格式如下:

	#ifdef __cplusplus	/
	extern "C" {		
	#endif
	
		/ /按照C方式编译;
	
	#ifdef __cplusplus
	}
	#endif
	
编译代码时:
	(1)如果是C++编译器编译,则有标准宏__cplusplus,"__extern "C" { "成立 ,下面的 '}'也成立。
	也就拼成程序语法:extern "C" { },中间C代码将强制按照C方式编译。
	
	(2)如果是C编译器编译,因为标准宏__cplusplus是C++编译器特有,C编译器不支持标准宏__cplusplus;
	所有上面和下面的判断语句:"#ifdef __cplusplus"都不成立。中间C代码将按照其本来的默认C方式编译。
	
	因此上面这种语法,既能保证代码能在C编译器下编译通过,也能保证代码能在C++编译器下编译通过。	
	

此种方法也是适用C种调用C++代码。

  • 代码案例:main.cpp
    注:add()函数.c文件及其头文件"add.h"省略
	#include <stdio.h>
	
	
	#ifdef __cplusplus
	extern "C" {
	#endif
	
	#include "add.h"
	
	#ifdef __cplusplus
	}
	#endif
	
	
	int main()
	{
	    int c = add(1, 2);
	    
	    printf("c = %d\n", c);
	    
	    return 0;
	}
	

(4)C++调用C语言时,需要注意的事项:
1)C++编译器不能以C的方式编译重载函数。即extern “C”{此代码块:不能出现重载函数}
2)编译方式能决定符号表中的函数名编译后对应的目标名

  • c++的编译方式是依据函数名和参数列表编译成目标名
  • c的编译方式是只依据函数名编译成目标名,如果用C++编译器以C的方式编译重载函数,会导致符号表中函数名冲突。

3)nm + 目标文件.o:查看符号表->函数名标识符,可以对比C和C++的编译方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值