一、static 关键字
-
当
static
用于函数里的变量时:通常,你在函数里定义的变量,当函数运行完就消失了,下次再运行函数时,这个变量又是全新的。但如果你在函数内部的变量前面加上static
,这个变量就会记住上次运行函数时的状态。就像是游戏里的存档点,下次进入函数时,可以从上次离开的地方继续。
(1)当不使用static时:
(2)当使用static时
-
当
static
用于文件顶部的变量或函数时:通常,你在一个文件顶部定义的变量或函数,其他文件也可以使用它们,就像大家共享一本公开的笔记一样。但如果你在这些变量或函数前面加上static
,它们就像是变成了秘密日记,只有在这个文件内部才能看到和使用,其他文件就不知道它们的存在了。
简单来说,static
关键字就是一个记忆和隐私的工具。在函数里使用时,它帮助变量记住上次的状态;在文件顶部使用时,它帮助变量或函数保持私密,不被其他文件看到。
当static
关键字用于文件顶部的变量或函数时,它们变为该文件私有,即只能在定义它们的文件内部被访问或调用。这有助于隐藏细节,防止其他文件不小心改动到这些内部变量或调用这些内部函数。
下面是一个例子:
假设你有一个文件叫做main.c
,在这个文件顶部,你定义了一个static
变量和一个static
函数。
// 在main.c文件中
static int internalCounter = 0; // 只能在main.c中访问的静态变量
static void incrementCounter() { // 只能在main.c中调用的静态函数
internalCounter++;
}
void resetCounter() { // 全局函数,可以在其他文件中调用
internalCounter = 0;
}
void printCounter() { // 全局函数,可以在其他文件中调用
printf("Counter: %d\n", internalCounter);
incrementCounter(); // 在此函数内部调用静态函数
}
在这个例子中:
-
internalCounter
是一个static
变量,仅限于在main.c
文件中使用。其他文件不能直接访问或修改internalCounter
。 -
incrementCounter
是一个static
函数,只能在main.c
文件内被调用,其他文件不能调用它。 -
resetCounter
和printCounter
是非静态(全局)函数,可以被其他文件中的代码调用。尽管它们可以在main.c
文件外部被调用,但只有这些函数内部可以访问和修改internalCounter
,因为它是静态的。
这种方式可以保护internalCounter
变量和incrementCounter
函数不被外部文件直接访问,从而避免了潜在的错误或冲突。
例如,当在源.cpp前面不加static时
当run Hello_world.cpp时能成功
当在源.cpp前面加static时
三、宏的定义