在C中使用静态函数和变量的原因

Gau*_*ier 26 c linker static extern

我想知道使用static关键字作为文件中变量的范围限制,用C.

我认为构建C程序的标准方法是:

  • 有一堆c文件定义函数和变量,可能范围有限static.
  • 有一堆h文件声明相应c文件的函数和可能的变量,供其他c文件使用.私有函数和变量不会在h文件中发布.
  • 每个c文件都单独编译为o文件.
  • 所有o文件都链接到一个应用程序文件.

static如果变量未在h文件中发布,我认为声明gobal的原因有两个:

  • 一个是为了可读性.告知未来的读者,包括我自己,在任何其他文件中都不能访问变量.
  • 第二个是防止另一个c文件重新声明变量为extern.我认为链接器不喜欢变量是externstatic.(我不喜欢重新声明其他人拥有的变量的文件的想法,这extern是可以的做法吗?)

还有其他原因吗?

也是一样的static功能.如果原型未在h文件中发布,其他文件可能无法使用该函数,那么为什么要定义它static呢?我可以看到同样的两个原因,但没有更多.

cra*_*cot 26

当您谈论通知其他读者时,请将编译器本身视为读者.如果声明了变量,则static可能会影响优化的启动程度.

重新定义static变量extern是不可能的,但编译器会(像往常一样)给你足够的绳索来挂起自己.

如果我static int foo;在一个文件和int foo;另一个文件中写入,它们被认为是不同的变量,尽管它们具有相同的名称和类型 - 编译器不会抱怨但是在稍后尝试读取和/或调试代码时可能会非常困惑.(如果我extern int foo;在第二种情况下写,那将无法链接,除非我在int foo;其他地方声明非静态.)

全局变量很少出现在头文件中,但是当它们出现时,应该声明它们extern.如果不是,根据您的编译器,您冒着包含该标头的每个源文件将声明其自己的变量副本的风险:最多这将导致链路故障(乘法定义的符号),最坏的情况是几个令人困惑的情况.


qrd*_*rdl 9

通过static在文件级别声明变量(static在函数内具有不同的含义),您禁止其他单元访问它,例如,如果您尝试在另一个单元内使用变量(声明为extern),链接器将找不到此符号.

  • IMO,`static`在所有三个众所周知的用途(文件变量,函数变量,函数)中具有相同的含义,即:"这具有有限的范围并且在整个程序执行期间具有恒定的地址". (2认同)

INS*_*INS 8

当你声明一个静态函数时,对函数的调用是"近距离调用",理论上它比"远程调用"表现更好.您可以谷歌获取更多信息.是我通过简单的谷歌搜索找到的.