在实际的工程中,C++和C的相互调用时不可避免的。但是有时候用C语言的编译器编译成的软件包,在C++的程序中调用会出现错误。
先看一下一个例子:
add.c
#include "add.h"
int add(int a, int b)
{
return a + b;
}
add.h
int add(int a, int b);
将这两个文件用C语言编译器编译成目标文件:
gcc add.c -o add.o
下面是一个C++主程序
main.cpp
add.h
#include <stdio.h>
#include "add.h"
int main()
{
int c = add(1, 2);
printf("c = %d\n", c);
return 0;
}
用C++编译器编译:
g++ main.cpp add.o
用C++编译器编译的时候,会提示错误,说没哟add()这个函数。也就是说用C语言编译的add()函数无法在C++编译器中无法得到调用。
在C++中:
C++编译器能够兼容C语言编译方式
C++编译器会优先使用C++的编译方式
extern关键字能够强制让C++编译器按C语言的编译器编译程序
例如将上面的主程序修改一下:
#include <stdio.h>
extern "C" // 强制用C语言编译器编译
{
#include "add.h"
}
int main()
{
int c = add(1, 2);
printf("c = %d\n", c);
return 0;
}
当编译运行现在的代码就能得到运行。
在C语言中,是不支持extern “C” {} 这种方式的,但是我们上面那个程序如果用C语言编译器来编译会出错,用C++编译器则不会出错,这个时候我们可以用C++编译器内置的标准宏定义**__cplusplus**,来让我们的程序在C++和C语言的编译器编译运行都不会出错。我们对上面的程序做一下修改:
#include <stdio.h>
#ifdef __cplusplus //如果是C++编译器,则使用extern "C",如果是C语言编译器,则直接#include "add.h"
extern "C" {
#endif
#include "add.h"
#ifdef __cplusplus
}
#endif
int main()
{
int c = add(1, 2);
printf("c = %d\n", c);
return 0;
}
用上面的扩展宏定义之后就能同时在C++和C语言编译器编译运行了。
注意事项
1、C++编译器不能以C的方式编译重载函数
2、编译方式决定函数名被编译之后的目标名
C++编译器将函数名和参数列表编译成函数名
c编译器只将函数名作为目标名进行编译