extern static 的作用和注意点 && c++如何实现函数的重载

好久没写新文章了,最近几乎没有做题目了,一直在学习学校的课程和准备软考,好不容易考完了又要看oc了。在学校oc的时候无意中看到了extern和static的作用,赶紧记录下来。以前一直是在console下写题目,从来没有接触过项目,现在才知道,原来一个项目链接的时候是把多个c文件连接起来,而不仅仅是头文件,但是main函数只能有一个(说出来都觉得自己弱到爆了。。。。)

extern表示声明,用来修饰变量表示这个变量可能在同一个项目下的另外一个c文件中定义了,如果别的c文件中定义了,那么这个变量就是用的那个c文件中定义的变量。

比如有两个c文件:A,B。

A.cpp:
#include <stdio.h>

extern int i;

int main(int argc, const char * argv[])
{
    printf("%d",i);
    return 0;
}

B.cpp
#include <stdio.h>

int i = 1;

当编译器调用用extern修饰的变量时,编译器首先会在别的文件里找有没有同名的变量的定义,如果有,那么就调用别的文件里的这个变量(这个变量一定要是全局变量),如果没在别的文件里找到,那么编译器就会报错(用vs2010编译的)。这里虽然A里面没有给i赋值,但是B里面定义了i,所以编译器会找到B里面的i来用,所以i的值为1。

这里有几个注意点(以下结论都是在xcode环境下编译,如有误差,欢迎指正,至少我就发现我在A和B里都写上int i时,跟百度百科里的编译链接结果不同,我的是可以通过的):

1.项目中,不能都是声明,没有定义,例如A:extern int i ,B:extern int i; A:extern int i;B:(不写任何东西)都是错误的。

2.有且仅能有一个声明并定义。例如A:extern int i = 3 ,B:extern int i = 3;是错误的。

3.(有可能只在xcode下成立)不加extern修饰时,编译器会根据情况自动选择在变量前添加或者不添加extern,例如A:int i,B: int i编译器会认为其中一个是定义,并且给其中(其中一个或全部)变量加上extern,如果有A:int i = 3,B: int i = 3,因为有两个定义,所以会报错,但是A:int i = 3,B: int i 是不会报错的,编译器会自动在B中的i前面加上extern


扫描二维码关注公众号,回复: 3789470 查看本文章

还有一个extern “c”。这个牵涉到c++给函数命名的问题,c++之所以可以实现多态,是因为他给每一个函数起了一个不同的名字,比如有一个function(int a);函数,这个函数在编译器里被看做是名字是_function_inta的函数(具体是存放的是什么名字不清楚,只是表达这个意思,我也是参考了别人的博文)function(int a,int b)函数,那么编译器看做是名为_function_inta_intb 的函数,那么编译器就可以准确区分同名,但是参数类型或个数不同的函数了,但是在c语言里面,这个两个函数在编译器看来都是叫做function,所以就不能区分。如果在c++工程里面包含c的文件或函数,如果c++文件想引用c的函数,比如想引用function(int a)函数,编译器在找的时候是找名字为_function_inta的函数,但是c里面却存的名为function的函数,这时候如果在引入c函数的时候告诉编译器这是extern “c”的,那么就可以避免这个问题了。

static 的作用常用的是三种

1。约束变量和函数的作用域

如果多个c文件里定义了同样的全局变量名的时候,编译不会报错,在连接的阶段就会报错,因为连接时把所有的c文件连接起来,发现有重名的变量就会报错。

A.cpp:
#include <stdio.h>

int i = 1;

int main(int argc, const char * argv[])
{
    printf("%d",i);
    return 0;
}


B.cpp
#include <stdio.h>

int i = 1;

这样是会报错的。这里有个地方 要重点注意,在声明时如果分配了存储空间即是定义,外部变量(即函数,类作用域之外的变量)只能被定义一次,如果在变量前面加了static,那么编译器就会将变量或函数的作用范围约束在本文件内,就不会出现这种错误。


2.静态初始化变量

也就是只给变量初始化一次。这应该都知道吧。。。

3.

将变量的初始值置为0,省的一个个去改



猜你喜欢

转载自blog.csdn.net/a549875231/article/details/15340417