extern "C"与C++中的C函数调用(2)

  前面已经深刻了解过extern "C"了,下面进一步探讨一下extern “C”的使用方法。ios

一、  C代码中包含extern “C”,C代码没法经过编译([1]中C++中调用C的方法1错误)函数

  代码以下:spa

//C代码头文件CDemo.h
#include <stdio.h>
#ifndef C_SRC_DEMO_H  
#define C_SRC_DEMO_H  
extern "C" int f(int x,int y);
#endif  // C_SRC_DEMO_H

 

//C代码CDemo.c
#include "CDemo.h"

int f(int x,int y)
{
        printf("In C file\n");
        printf("x + y = %d\n",x+y);
        return 0;
}

  在Linux下,$:gcc  –c  CDemo.c 编译通不过code

  出错信息以下:blog

  

  结论:在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。编译器

 

二、  若是在C头文件中函数声明了函数(f(int x,int y))为extern类型,而在C++中包含该头文件后,再从新声明并添加上extern "C"(extern int f( int x, int y )),C++文件编译通不过([1]中C++中调用C的方法2错误)io

代码以下: 编译

//C代码头文件CDemo.h
#include <stdio.h>
#ifndef C_SRC_DEMO_H  
#define C_SRC_DEMO_H  
extern int f(int x,int y);
#endif  // C_SRC_DEMO_H

 

//C代码 CDemo.c
#include "CDemo.h"

int f(int x,int y)
{
        printf("In C file\n");
        printf("x + y = %d\n",x+y);
        return 0;
}

 

//C++代码 cppDemo.cpp
#include "CDemo.h"
#include <iostream>
extern "C" int f(int x,int y);

int main()
{
        f(2,3);
        return 0;
}

  在Linux下,$:gcc  -c  CDemo.c 能够经过,并生成CDemo.o文件class

  $:g++  -c  cppDemo.cpp 编译出错stream

  出错信息:

  

可是还要注意一下两点:

(1)若是不从新声明,即C++代码更改成以下:

//C++代码 cppDemo.cpp
#include "CDemo.h"
#include <iostream>

int main()
{
        f(2,3);
        return 0;
}

  编译能够经过,可是将两个.o文件连接起来生成可执行文件时,会出错执行状况以下:

  $g++  cppDemo.o CDemo.o –o cppDemo

  

  这说明C++文件没有找到定义在C文件中的f函数,这是由于该函数被C编译器编译后在符号库中的名字与C++编译器产生的名字不一样,如, C编译器产生的函数f的符号库中的名字为:f,而C++编译器产生的为_Z1fii(不一样的编译器可能生成的名字不一样,可是都采用了相同的机制,生成的新名字称为“mangled name”)。

(2)不管C代码中声明有没有包含关键字extern,只要C++中有extern “C”,连接时便不会出错。

参考文献:

[1] 《编写高质量代码:改善C++程序的150个建议》,建议19:明白在C++中如何使用C

相关文章
相关标签/搜索