菜鸟关于static的小问题

时间:2020-12-24 17:35:32
//file1.cpp

int g(int v);
static int i=20;
int x;

void f(int v)
{
x=g(v);
}

static int g(int p)
{
return i+p;
}
中 的函数g()的定义前面的static加与不加有什么区别li
难道表示静态函数?

8 个解决方案

#1


有区别;
因为i是一个静态的int 型变量,在函数g()中调用了变量i,所以g必须为静态函数,
因为只有静态函数方可调用静态变量
这是我个人的理解,如有错误,请楼下高手指正。。

#2


函数g()的定义前面的static加与不加
这是为了定义这个function的可见范围
如果有另外一个xxx.c文件
不加static,那么在xxx.c里能调用g(int);
加了static,那么在xxx.c中g(int)就是不可见的, 也就不能调用g(int);

#3


newegg2002(天生我菜有X用) 说的不对,非static函数一样可以调用static变量的。
函数加static表示是本文件内使用的函数,不能在其他文件中访问。

#4


加了static 是静态变量,静态变量只能作用于本文件,每个文件都可以有相同名字的静态变量而且互相独立。
不加static是全局变量,全局变量作用于整个程序, 整个程序只能有一个相同名字的全局变量。
函数前加static 是很老的c 标准,先在加和不加是一样的。

举个例子解释1:
//test.h 
static int i = 0;

//test1.cpp
#include "test.h"
void inc() {  i++; }

//test2.cpp
#include "test.h"
void inc(); //声明一下 inc 以便调用

void main()
{
   i++;
   inc();
   printf("%d\n",i);
}

结果是什么? 2? 错了,结果是1,因为 test1.cpp 的i++ 和test2.cpp 的i++ 实际上操作的是不同的变量。

如果,把i 改成全局变量(去掉i 前面的 static), 结果是什么?结果是编译通过,但链接不通过,会报multiple definition of `i'.

把test1.cpp test2.cpp 改为以下,就可通过。

//test3.cpp
int i = 0; // 定义全局变量
void inc() {  i++; }

//test2.cpp
extern int i; // 声明全局变量
void inc(); //声明一下 inc 以便调用

void main()
{
   i++;
   inc();
   printf("%d\n",i);
}

这次程序结果是 2.

 extern 只是声明一个全局变量,并没有分配内存。一个程序只能在一个文件里对一个全局变量定义一次,其他文件要用它,必须用extern 声明。

#5


》函数前加static 是很老的c 标准,先在加和不加是一样的。
我指的是全局函数,不是类成员。

#6


static主要是在链接方面应于于function。

#7


对于楼主的例子,有还是没有static是没有区别的
static变量一样可以被其他cpp文件使用,只要在其中标注extern static ...

静态变量只是在类的内部才会特殊一些,是所有类对象所共享的

#8


static 的两层含义,经常相互冲突:
1)存放在静态存储区,
2)对于特定的编译单位,static意味着内部连接,几控制名字的可见性只在这个单元或类里

对于任何函数或变量都尊从这两条原则:

#1


有区别;
因为i是一个静态的int 型变量,在函数g()中调用了变量i,所以g必须为静态函数,
因为只有静态函数方可调用静态变量
这是我个人的理解,如有错误,请楼下高手指正。。

#2


函数g()的定义前面的static加与不加
这是为了定义这个function的可见范围
如果有另外一个xxx.c文件
不加static,那么在xxx.c里能调用g(int);
加了static,那么在xxx.c中g(int)就是不可见的, 也就不能调用g(int);

#3


newegg2002(天生我菜有X用) 说的不对,非static函数一样可以调用static变量的。
函数加static表示是本文件内使用的函数,不能在其他文件中访问。

#4


加了static 是静态变量,静态变量只能作用于本文件,每个文件都可以有相同名字的静态变量而且互相独立。
不加static是全局变量,全局变量作用于整个程序, 整个程序只能有一个相同名字的全局变量。
函数前加static 是很老的c 标准,先在加和不加是一样的。

举个例子解释1:
//test.h 
static int i = 0;

//test1.cpp
#include "test.h"
void inc() {  i++; }

//test2.cpp
#include "test.h"
void inc(); //声明一下 inc 以便调用

void main()
{
   i++;
   inc();
   printf("%d\n",i);
}

结果是什么? 2? 错了,结果是1,因为 test1.cpp 的i++ 和test2.cpp 的i++ 实际上操作的是不同的变量。

如果,把i 改成全局变量(去掉i 前面的 static), 结果是什么?结果是编译通过,但链接不通过,会报multiple definition of `i'.

把test1.cpp test2.cpp 改为以下,就可通过。

//test3.cpp
int i = 0; // 定义全局变量
void inc() {  i++; }

//test2.cpp
extern int i; // 声明全局变量
void inc(); //声明一下 inc 以便调用

void main()
{
   i++;
   inc();
   printf("%d\n",i);
}

这次程序结果是 2.

 extern 只是声明一个全局变量,并没有分配内存。一个程序只能在一个文件里对一个全局变量定义一次,其他文件要用它,必须用extern 声明。

#5


》函数前加static 是很老的c 标准,先在加和不加是一样的。
我指的是全局函数,不是类成员。

#6


static主要是在链接方面应于于function。

#7


对于楼主的例子,有还是没有static是没有区别的
static变量一样可以被其他cpp文件使用,只要在其中标注extern static ...

静态变量只是在类的内部才会特殊一些,是所有类对象所共享的

#8


static 的两层含义,经常相互冲突:
1)存放在静态存储区,
2)对于特定的编译单位,static意味着内部连接,几控制名字的可见性只在这个单元或类里

对于任何函数或变量都尊从这两条原则: