我有一个程序来查找数字的倒数,但主程序是用C语言编写的,而reciprocal
函数是用c ++编写的。接下来我有一个头文件reciprocal.hpp
,其中有一些条件编译代码使reciprocal
函数成为一个extern函数。有人可以解释一下reciprocal.hpp
程序中的内容。
的main.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int i;
i = atoi(argv[1]);
printf("\nThe reciprocal of %d is %f\n",i,reciprocal(i));
return 0;
}
reciprocal.cpp
#include<cassert>
#include "reciprocal.hpp"
double reciprocal(int i)
{
assert( i != 0);
return 1.0/i;
}
reciprocal.hpp
#ifdef __cplusplus
extern "C"
{
#endif
extern double reciprocal(int i);
#ifdef __cplusplus
}
#endif
我不明白reciprocal.hpp
中发生了什么。请帮助!!
答案 0 :(得分:7)
C ++编译器总是定义__cplusplus
符号。所以,标题正在做的是将原型包装在
extern "C" { ... }
这告诉编译器不要对该块中包含的内容执行name mangling。现在,C代码可以通过其原始名称引用该函数,就像它是C函数一样。
答案 1 :(得分:1)
如果您指的是ifdef
,如果标题编译为C ++,它们只允许将函数导出到C. extern
行只是为reciprocal
定义了一个函数原型。