打印
[复制链接]
1644|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
benjaminka|  楼主 | 2025-2-20 09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
都知道static表示静态的的意思,也可以说是对变量和函数进行文本上的限制,多个文件中是可以有同名的static函数和变量的,不过他们却代表着不同的函数和变量,这一点要尤为注意,如果该头文件在不同文件中大量使用其中的变量和函数也会导致程序的增加和内存的变大,下面作者就为这几点用程序来证明下:
  • //Filename:Add.h
  • #ifndef __ADD_H__
  • #define __ADD_H__

  • static int add(int a,int b)
  • {
  •     return (a + b);
  • }

  • #endif

  • //filename:App1.c
  • #include <stdio.h>
  • #include "Add.h"
  • /*********************************************
  • * Fuction:add_APP1
  • ********************************************/
  • int add_APP1(int a,int b)
  • {
  •     printf("add_APP1_addFuc:0x%x\n",(int*)add);
  •     return add(a,b);   
  • }


使用特权

评论回复
沙发
loutin| | 2025-3-10 09:50 | 只看该作者
当 static 作用于局部变量(函数内部)时,该变量的生命周期不再局限于函数调用,而是贯穿整个程序运行,且只初始化一次。

使用特权

评论回复
板凳
sheflynn| | 2025-3-10 11:06 | 只看该作者
​头文件中避免定义 static 变量和函数,仅声明接口。

使用特权

评论回复
地板
sesefadou| | 2025-3-10 18:04 | 只看该作者
将全局变量设为 static,除非需要跨文件共享。

使用特权

评论回复
5
zerorobert| | 2025-3-11 12:56 | 只看该作者
局部静态变量在多线程环境下无需额外同步(初始化是原子操作)。

使用特权

评论回复
6
mmbs| | 2025-3-11 13:35 | 只看该作者
尽量避免在头文件中定义static全局变量,因为这可能导致不必要的内存浪费和潜在的命名冲突

使用特权

评论回复
7
maqianqu| | 2025-3-11 14:56 | 只看该作者
防止全局变量被意外修改。              

使用特权

评论回复
8
macpherson| | 2025-3-11 16:18 | 只看该作者
非static的全局变量和函数具有外部链接(external linkage),这意味着它们可以在多个文件之间共享。相反,static全局变量和函数具有内部链接(internal linkage),仅在其定义的文件内可见。

使用特权

评论回复
9
jimmhu| | 2025-3-11 17:31 | 只看该作者
static 修饰的变量在程序的整个运行期间都存在,即使在函数调用结束后也不会被销毁。

使用特权

评论回复
10
lzbf| | 2025-3-12 14:56 | 只看该作者
C语言中static关键字的正确与错误用法对比


场景        正确做法        错误做法
头文件中的全局变量        使用 extern 声明,在源文件中定义        在头文件中用 static 定义
文件内部私有变量        在源文件中用 static 定义        在头文件中用 static 定义
函数内部静态变量        在函数内用 static 定义        无

使用特权

评论回复
11
alvpeg| | 2025-3-12 15:31 | 只看该作者
未经初始化的静态局部变量会被程序自动初始化为0(对于数值类型)或空字符(对于字符类型)。而静态全局变量则会根据其类型进行默认初始化(如数值类型初始化为0,指针类型初始化为NULL等)。

使用特权

评论回复
12
janewood| | 2025-3-12 17:15 | 只看该作者
由于 static 限制了变量或函数的作用域,不同文件中可以有同名 static 变量或函数,它们是独立的,不会相互冲突。

使用特权

评论回复
13
gygp| | 2025-3-12 17:44 | 只看该作者
当 static 用于局部变量时,它改变了局部变量的存储期限,使得局部变量在程序执行期间一直存在,而不是在函数调用结束后销毁。

使用特权

评论回复
14
everyrobin| | 2025-3-14 10:58 | 只看该作者
使用 static 变量的函数可能不是线程安全的,因为 static 变量在多个函数调用之间共享状态。

使用特权

评论回复
15
geraldbetty| | 2025-3-14 11:29 | 只看该作者
全局变量和函数在源文件中定义,且非static的全局变量需在头文件中用extern声明。

使用特权

评论回复
16
rosemoore| | 2025-3-14 12:01 | 只看该作者
static 修饰的全局变量仅在定义它的文件中可见,不会被其他文件中的代码访问。

使用特权

评论回复
17
zerorobert| | 2025-3-14 12:38 | 只看该作者
无论是静态局部变量还是静态全局变量,它们都具有静态存储期。这意味着这些变量在程序开始运行时就分配内存空间,并在程序的整个运行期间都存在。相比之下,普通局部变量具有自动存储期,它们在函数或语句块执行时分配内存空间,并在函数或语句块执行完毕后释放内存空间。

使用特权

评论回复
18
hearstnorman323| | 2025-3-14 14:15 | 只看该作者
当static用于变量时(无论是全局变量还是局部变量),它都会限制该变量的作用域。对于全局变量,static会将其作用域限制在定义它的文件内,即该文件外的其他文件无法访问这个变量。这有助于避免命名冲突,因为不同的文件中可以有同名的static全局变量,但它们彼此独立。
当static用于函数时,它同样会限制该函数的作用域,使得该函数只能在定义它的文件内被调用。这有助于封装代码,隐藏实现细节。

使用特权

评论回复
19
yeates333| | 2025-3-14 16:20 | 只看该作者
static 修饰的变量默认初始化为0(对于整数类型)或NULL(对于指针类型)。

使用特权

评论回复
20
iyoum| | 2025-3-14 16:55 | 只看该作者
过度使用 static 变量和函数可能会导致代码难以理解和维护,因为它们的存在和行为可能不如全局变量和函数那样明显。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

1432

帖子

0

粉丝