extern关键字的用法
1.引用同一工程下不同文件下的全局变量
a.cpp int data = 10;
b.cpp extern int data ;cout<<data<<endl;//success
a.c int a = 10;
b.c extern int a; printf("%d\n",a);//success
不管是在 .c还是.cpp中,如果有static修饰全局变量,会将此全局变量从global变为local.
另外同一工程下其他文件引用此变量不会成功
.c和.cpp的区别
如果在.cpp中,const修饰全局变量时 会将此全局变量从global变为local.
另外同一工程下其他文件引用此变量不会成功
2.C++调用c语句
C++编译器生成符号的规则是根据函数名加参数列表
C编译器生成符号的规则是根据函数名
但是C++编译器可以生成c语言的符号 只要利用extern "C"'即可
main.c
int sum(int a,int b)
{
return a+b;
}
test.cpp
extern "C" //告诉C++编译器extern里面的按照C编译器规则生成符号 那么就能找到sum符号
{
int sum(int a,int b);
}
#ifdef __cplusplus
extern "C" {
#endif
上面的写法就是为了能将C代码和c++代码混用 如果在c++代码中遇到这种写法,就是告诉C++编译器以c的生成符号规则符号
C编译器不能生成C++符号 如果想要C语句调用c++语句,那么以下面的做法:
main.c extern int sum();//sum符号
test.cpp
int sum(int a,int b) //sum_int_int符号
{
return a+b;
}
但是要在.C文件中引用.cpp的函数 由于两者生成的符号不同 为了能让.c调用.cpp的函数
在.cpp中加入extern 'c' 让其以c的符号规则生成符号 那么在连接阶段 .c文件就可以找到sum符号的定义处
test.c引入c++代码
main.cpp
extern "C"
{
int sum(int a,int b)
{
return a+b;
}
};
test.c
extern int sum(int a,int b);
int main()
{
int tmp = sum(10,20);
printf("%d\n",tmp);
return 0;
}
.cpp引用.c代码
main.cpp
extern "C"
{
int sum(int a,int b);
};
int main()
{
int tmp = sum(10,20);
printf("%d\n",tmp);
return 0;
}
test.c
int sum(int a,int b)
{
return a+b;
}