龙空技术网

extern关键字

漫漫编程路 53

前言:

现在朋友们对“c语言中和有什么区别”大体比较着重,各位老铁们都需要知道一些“c语言中和有什么区别”的相关内容。那么小编在网上收集了一些有关“c语言中和有什么区别””的相关知识,希望你们能喜欢,大家一起来了解一下吧!

作用域

模块化的c语言的工程是由多个源文件(.c文件)构成的,在每个源文件中,都形成一个文件作用域。在源文件中定义函数,那么在函数之外的地方就属于全局作用域,即使是多个源文件,只要在函数之外就属于全局作用域,全局作用域全局都可访问。而在函数之内的空间声明变量,那就属于局部作用域。

局部变量

局部变量是指在某个函数内部声明的变量,它有两个含义:

在某个函数内声明的局部变量,不能被其他函数使用,即只在申明它的函数内有效每次调用函数时生成的局部变量地址可能都是不同的,即局部变量在函数调用结束后,就会释放,下次调用函数生成的局部变量又是一个新的。

另外,在函数的形参中声明的变量,也都是局部变量。

全局变量

全局变量声明在所有函数体之外,全局变量在文件作用域内可见。即从变量被声明的下一行,一直到当前文件的末尾,它都可以被直接使用,因此全局变量可以被它之后定义的所有函数访问。

需要注意一点,编译器会自动将全局变量进行零值初始化,因此在使用时只需要声明即可。如果需要手动指定其值初始化,则它只能被常量表达式初始化,使用其他的变量表达式初始化是不合法的。

static关键字

除了局部变量和全局变量,c语言中还是有静态局部变量和静态全局变量。申明时使用static关键字即代码静态的意思。

静态全局变量和普通全局变量的区别不是很大,主要体现在访问权限的区别上。在c语言中,全局变量是在整个程序的生命周期都有效的,换句话说,一旦声明了一个全局变量,则整个程序中都可以访问,而静态全局变量则只在声明它的源文件中可以访问。静态全局变量虽然也是在整个程序的生命周期中都有效,但它在其他文件中不可见,无法被访问。

静态局部变量和普通局部变量的区别就很大了,主要有三个区别:

存储位置不同。静态局部变量被编译器放在全局存储区,虽是局部变量,但是在整个程序的生命周期中都存在。而普通局部变量在函数调用结束后就会被释放。从这一点上看,静态局部变量和全局变量被放在了相同的存储区。静态局部变量被编译器自动初始化为零值。我们都知道普通局部变量的原则是必须先初始化再使用,而静态局部变量和全局变量一样,会被自动初始化,使用时只需声明,无需手动初始化。静态局部变量只能被声明它的函数访问。静态局部变量与普通局部变量的作用域相同,都只能被声明它的函数访问,extern "C"被extern "C"修饰的代码会按照C语言的方式去编译

以下代码编译失败:(C++支持函数重载,C不支持函数重载(重载按C编译就会报错)

写法一:extern "C" void fun() {    cout << func() << endl;}extern "C" void fun(int age) {    cout << func(int age) << age << endl;}写法二:extern "C" {    void func() {        cout << func() << endl;    }    void func(int age) {        cout << func(int age) << age << endl;    }}

2.如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰

以下代码编译成功:(C编译产生的函数名和C++编译产生的函数名是不一样的所以编译成功)

写法一:void func();extern "C" void func(int age);void func() {    cout << func() << endl;}void fun(int age) {    cout << func(int age) << age << endl;}写法二:void func();extern "C" {    void func(int age);}void func() {    cout << func() << endl;}void fun(int age) {    cout << func(int age) << age << endl;}

3.extern "C"的使用

加extern "C"的函数,当然目的就是能让其他.cpp的文件来调用c实现的函数。那么怎么才能让.cpp的文件调用c实现的函数呢?

//math.c//c编译器编译为:_sumint sum(int v1, int v2) {  return v1 + v2;}//c编译器编译为:_deltaint delta(int v1, int v2) {  return v1 - v2;}
// main.cppextern "C" {  int sum(int v1, int v2);  int delta(int v1, int v2);}int main() {  cout << sum(10, 20) << endl;  cout << delta(30, 20) << endl;  return 0;}

//math.hint sum(int v1, int v2);int delta(int v1, int v2);
//math.c//c编译器编译为:_sumint sum(int v1, int v2) {  return v1 + v2;}//c编译器编译为:_deltaint delta(int v1, int v2) {  return v1 - v2;}
// main.cppextern "C" {  #include "math.h"}int main() {  cout << sum(10, 20) << endl;  cout << delta(30, 20) << endl;  return 0;}

一般c语言写的第三方库,需要既能满足c调用,也能满足c++调用。就需要配合ifdef __cplusplus了。(因为cpp和c的对函数编译产生的函数名是不同的,如果不用__cplusplus就可能报函数未定义)

//math.h#ifdef __cpluscplusextern "C" {#enddef    int sum(int v1, int v2);    int delta(int v1, int v2);#ifdef __cplusplus}#enddef
//math.c//c编译器编译为:_sumint sum(int v1, int v2) {  return v1 + v2;}//c编译器编译为:_deltaint delta(int v1, int v2) {  return v1 - v2;}
#include "math.h"int main() {  cout << sum(10, 20) << endl;  cout << delta(30, 20) << endl;  return 0;}

说明:__cpluscplus这个宏是.cpp文件隐含定义的,即在.cpp文件的第一行是:define __cplusplus

标签: #c语言中和有什么区别 #c语言的所有关键字是什么意思 #c语言static关键字 #c语言extern