C调用C函数实例详解前言以前见到extern C这样的语句只是简单地知道跟外部链接有关但是没有深刻理解它的意思。首先为什么要使用extern C修饰符C调用其它语言的函数由于编译器生成函数的机制不一样所以需要经过特殊处理才可以调用。调用C语言的函数需要在函数声明的地方语句extern C。如果不使用该语句在链接的时候编译器就会报以下这种错误。Test.obj : error LNK2019: 无法解析的外部符号 void __cdecl DeleteStack(struct _Node *) (?DeleteStackYAXPAU_NodeZ)该符号在函数 _main 中被引用。然后是如何使用应该怎么使用该语句呢刚开始我简单地在C源文件的前面使用该语句声明但是还是出错而且是在编译阶段就报错。1error C2732: 链接规范与“DeleteStack”的早期规范冲突。为什么会出现这个错误呢因为C源文件已经引入了C的头文件在头文件里声明该函数时没有extern修饰而这里有extern修饰所以冲突了。解决的办法有两个。一。在C头文件中加上extern修饰符。直接加也不行。因为C源文件也包含了这个头文件当编译C源文件时就会出现错误。所以需要一种机制来区分是编译C还是C文件。方法如下1234#ifdef __cplusplusexternC#endifvoidDeleteStack(Stack stack);因为在编译C文件时自动定义预处理器名字__cplusplus而编译C时没有该处理器名字。所以只有编译C时才有符号extern “C”。此外链接指示extern C有单个和复合两种形式。以上为单个形式复合形式可以同时将几个函数声明为extern C12345externC{voidDeleteStack(Stack stack);voidPrintStack(Stack stack);voidPop(Stack stack);}加上预处理器名字如下1234567891011#ifdef __cplusplusexternC{#endifvoidDeleteStack(Stack stack);voidPrintStack(Stack stack);voidPop(Stack stack);#ifdef __cplusplus}#endif二。编写一个C风格的头文件在这里添加extern修饰符。使用方法一很简单。但是如果该头文件是别人写好你无法修改。这个时候就要使用其它方法了。方法是定义C自己的头文件文件名为CStack.h1234// CStack.hexternC{#include Stack.h;}感谢阅读希望能帮助到大家谢谢大家对本站的支持