1.首先介绍一下vs2008对C和C++文件的分别编译
(1)在一个工程下分别编译C和C++文件并链接:
分别编译很简单:
选择要设置的文件:属性-->C/C++-->高级-->编译为,然后下拉菜单中选择:编译为C代码(/TC) [或者选择编译为C++代码(/TP)]。这样就可以对不同语言文件分别编译。
下一个工作是设置链接器的内容。不同编译器生成的目标文件中,符号表里面的符号命名准则可能会有不同,所以链接时会遇到“无法解析的外部符号”的错误。解决这个问题,使用 extern “C”,进行链接指示。
(2)如果出现如下编译错误:
1>cl: 命令行 error D8045 :不能使用 /clr 选项编译 C 文件“.\C_Header.c”
那试试去掉/clr选项: 工程配置->常规->公共语言支持(在下拉菜单中改为无公共语言支持);
——————————————————————————————————————————————————————————————————2.下面介绍extern和C
i. extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
与extern对应的关键字是 static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
ii.extern "C"
1
|
extern
"C"
char
*
strcpy
(
char
*,
const
char
*);
|
注意它与下面的声明的不同之处:
1
|
extern
char
*
strcpy
(
char
*,
const
char
*);
|
下面的这个声明仅表示在连接的时候调用strcpy()。
extern "C"指令非常有用,因为C和C++的近亲关系。注意:extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。
还有要说明的是,extern "C"指令仅指定编译和连接规约,但不影响语义。例如在函数声明中,指定了extern "C",仍然要遵守C++的类型检测、参数转换规则。
再看下面的一个例子,为了声明一个变量而不是定义一个变量,你必须在声明时指定extern关键字,但是当你又加上了"C",它不会改变语义,但是会改变它的编译和连接方式。
如果你有很多语言要加上extern "C",你可以将它们放到extern "C"{ }中。
iii.(结论)通过上面两节的分析,我们知道extern "C"的真实目的是实现 类C和C++的混合编程 。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。(注:我在这里所说的类C,代表的是跟C语言的编译和连接方式一致的所有语言)3.C++中调用C中的函数
//头文件C_Header.h
#ifndef _C_HEADER_H
#define _C_HEADER_H
extern void print(int i); //extern可有可无
#endif
//C的源文件C_Header.c
#include <stdio.h>
#include"C_Header.h"
void print(int i)
{
printf("i = %d\n",i);
}
//C++源程序:Main.cpp
#ifdef __cplusplus
extern "C"
{
#endif
#include "C_Header.h"
#ifdef __cplusplus
}
#endif
#include<iostream>
int main(int argc,char** argv)
{
print(3);
int i = 0;
std::cin>>i;
return 0;
}
4.C中调用C++
//c++头文件C++.h
#ifndef _CPLUSPLUS_H
#define _CPLUSPLUS_H
extern "C" void show(int i);//注意这里用的extern "C"
#endif
//C++源文件:C++.cpp
#include "C++.h"
#include<iostream>
void show(int i)
{
std::cout<<"i = "<<i<<std::endl;
}
//C源文件:C.c
extern void show(int i);//这里不可用#include"C++.h",因为C语言中不可用extern "C"
#include <stdio.h>
int main()
{
int i = 8;
show(i);
scanf("%d",&i);
return 0;
}
请留下你的足迹, 相互学习。谢谢