- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 C 中,您可以拥有在文件中的每个位置都可见的外部静态变量,而内部静态变量仅在函数中可见,但是是持久的
例如:
#include <stdio.h>
void foo_bar( void )
{
static counter = 0;
printf("counter is %d\n", counter);
counter++;
}
int main( void )
{
foo_bar();
foo_bar();
foo_bar();
return 0;
}
输出将是
counter is 0
counter is 1
counter is 2
我的问题是为什么要使用内部静态变量?如果您不希望您的静态变量在文件的其余部分可见,那么函数真的不应该在它自己的文件中吗?
最佳答案
这种混淆通常是因为 static
关键字有两个目的。
当在文件级别使用时,它控制编译单元之外的对象的可见性,而不是对象的持续时间(可见性和持续时间是我使用的外行术语在教育类(class)中,ISO 标准使用不同的术语,您最终可能想学习这些术语,但我发现它们会使大多数初学者感到困惑。
在文件级别创建的对象已经根据它们在文件级别的事实决定了它们的持续时间。 static
关键字只会使它们对链接器不可见。
在函数内部使用时,它控制持续时间,而不是可见性。可见性已经确定,因为它在函数内部——在函数外部是看不到的。在这种情况下,static
关键字导致对象与文件级对象同时创建。
请注意,从技术上讲,函数级静态可能在函数首次调用之前不一定存在(这对于 C++ 及其构造函数可能有意义),但我使用过的每个 C 实现都会创建其函数级静态同时作为文件级对象。
另外,虽然我使用“对象”这个词,但我并不是指 C++ 对象的意思(因为这是一个 C 问题)。这只是因为 static
可以应用于文件级别的变量或函数,我需要一个包罗万象的词来描述它。
函数级静态变量仍然被大量使用——如果不满足它们,它们可能会在多线程程序中造成麻烦,但是,如果您知道自己在做什么(或者您没有线程化),它们就是跨多个函数调用保留状态同时仍提供封装的最佳方式。
即使使用线程,您也可以在函数中执行一些技巧(例如在函数内分配线程特定数据)以使其在不不必要地暴露函数内部的情况下工作。
我能想到的唯一其他选择是全局变量和每次将“状态变量”传递给函数。
在这两种情况下,您都将函数的内部工作原理暴露给它的客户,并使函数依赖于客户的良好行为(这总是一个冒险的假设)。
关于c - C 中的内部静态变量,你会使用它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534735/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!