C预处理器问题

时间:2011-07-19 14:59:17

标签: c++

我有一个程序来查找数字的倒数,但主程序是用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中发生了什么。请帮助!!

2 个答案:

答案 0 :(得分:7)

C ++编译器总是定义__cplusplus符号。所以,标题正在做的是将原型包装在

extern "C" { ... }

这告诉编译器不要对该块中包含的内容执行name mangling。现在,C代码可以通过其原始名称引用该函数,就像它是C函数一样。

答案 1 :(得分:1)

如果您指的是ifdef,如果标题编译为C ++,它们只允许将函数导出到C. extern行只是为reciprocal定义了一个函数原型。