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++的编译方式。