Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中不同类型的静态_C_Variables - Fatal编程技术网

C中不同类型的静态

C中不同类型的静态,c,variables,C,Variables,我知道C中有三种类型的静态偏差: 1:常数-常数静态变量,例如:静态常数int i=5 2:可更改-只是一个正常的静态变量,例如:static int hi=10 这是我的问题 还有另一种形式的静态代码。这是什么意思?你能给我举个例子吗 谢谢大家! 编辑: 静态/常量变量是否存储在堆栈/堆上?应该可以回答您的问题 但是值得注意的是,除非您对C编译过程有足够的了解,否则这将是值得怀疑的 可以找到GCC的良好参考 我相信你问的是静态函数。。所以 静态函数 默认情况下,C中的函数为,这意味着该函数可以

我知道C中有三种类型的静态偏差:

1:常数-常数静态变量,例如:静态常数int i=5

2:可更改-只是一个正常的静态变量,例如:static int hi=10

这是我的问题

还有另一种形式的静态代码。这是什么意思?你能给我举个例子吗

谢谢大家!

编辑: 静态/常量变量是否存储在堆栈/堆上?

应该可以回答您的问题

但是值得注意的是,除非您对C编译过程有足够的了解,否则这将是值得怀疑的

可以找到GCC的良好参考

我相信你问的是静态函数。。所以

静态函数

默认情况下,C中的函数为,这意味着该函数可以在同一项目的任何其他文件中使用,当然也可以在同一代码中使用

如果您不喜欢这种情况,并且希望将函数限制在定义它的文件中,可以将其设置为静态。

应该回答您的问题

但是值得注意的是,除非您对C编译过程有足够的了解,否则这将是值得怀疑的

可以找到GCC的良好参考

我相信你问的是静态函数。。所以

静态函数

默认情况下,C中的函数为,这意味着该函数可以在同一项目的任何其他文件中使用,当然也可以在同一代码中使用


如果您不喜欢这种情况,并且希望将函数限制在定义它的文件中,可以将其设置为静态。

也许您正在谈论一个

这是static一词的特殊用法,它与静态变量完全不同

当您声明一个函数为静态时,这意味着它不能从另一个源文件链接。它通常用于保持某些函数的私有性

[编辑]注意,理论上,函数代码仍然可以使用指针从另一个源文件访问,但这不是正常的方式,当然也不是最容易访问函数的方式。感谢Eric Postphil指出这一点

不幸的是,在C标准中,同一个单词static表示两种不同的含义,具体取决于用于函数或变量


[编辑]:这是一个不同的问题,但无论如何:对于静态变量,它们既不在堆中也不在堆栈中分配。它们是静态的,这意味着它们是在静态空间中分配的,在启动时由编译器直接分配。堆栈用于内部函数变量,而堆用于malloc/free。

也许你说的是一个

这是static一词的特殊用法,它与静态变量完全不同

当您声明一个函数为静态时,这意味着它不能从另一个源文件链接。它通常用于保持某些函数的私有性

[编辑]注意,理论上,函数代码仍然可以使用指针从另一个源文件访问,但这不是正常的方式,当然也不是最容易访问函数的方式。感谢Eric Postphil指出这一点

不幸的是,在C标准中,同一个单词static表示两种不同的含义,具体取决于用于函数或变量

[编辑]:这是一个不同的问题,但无论如何:对于静态变量,它们既不在堆中也不在堆栈中分配。它们是静态的,这意味着它们是在静态空间中分配的,在启动时由编译器直接分配。Stack用于内部函数变量,heap用于malloc/free。

关键字static在C中有几种不同的用法。有一个笑话说,任何新版ISO C标准都需要为static创造新的含义

快速总结:块范围定义上的static关键字给出实体静态存储持续时间;在文件范围中,定义已经具有静态存储持续时间,它将为它们提供内部链接

一个对象可以具有多个存储持续时间中的任意一个。具有自动存储持续时间的对象仅在执行封闭块期间的运行时存在。在程序的整个执行过程中,存在一个具有静态存储持续时间的对象。在C11中还分配了临时存储持续时间,这一点我将不再赘述

标识符的任何定义也有一个链接,可以是外部链接、内部链接或无链接。链接控制标识符是否可以跨翻译单元(基本上是源文件)使用,但包含的文件不是单独的翻译单元。顾名思义,链接与链接器有关。您可以在两个不同的源文件中使用具有内部链接的同一标识符,它将引用两个不同的实体。但如果标识符具有外部链接,则只应定义它 一次,并且通常可以在多个源文件中用extern声明;所有这些声明都将引用同一实体

如果在块范围(即函数体内部)定义对象变量,则默认情况下,该变量具有自动存储持续时间且无链接。添加关键字static会给它提供静态存储持续时间,因此它存在并在对函数的调用中保留其值。它不会影响标识符的可见性

如果在文件范围(即任何函数体之外)定义对象,则默认情况下该对象具有静态存储持续时间和外部链接。将关键字static添加到定义中不会影响其存储持续时间,但会将其链接从外部更改为内部,从而对其他翻译单元隐藏名称。函数没有存储持续时间,只要程序运行,它们的代码就存在,但静态会以相同的方式影响它们的链接,将其从外部更改为内部

C99为static增加了另一个含义,即数组类型的函数参数,这与其他用途无关。

在C中,关键字static有几种不同的用法。有一个笑话是,ISO C标准的任何新版本都需要为static创造新的含义

快速总结:块范围定义上的static关键字给出实体静态存储持续时间;在文件范围中,定义已经具有静态存储持续时间,它将为它们提供内部链接

一个对象可以具有多个存储持续时间中的任意一个。具有自动存储持续时间的对象仅在执行封闭块期间的运行时存在。在程序的整个执行过程中,存在一个具有静态存储持续时间的对象。在C11中还分配了临时存储持续时间,这一点我将不再赘述

标识符的任何定义也有一个链接,可以是外部链接、内部链接或无链接。链接控制标识符是否可以跨翻译单元(基本上是源文件)使用,但包含的文件不是单独的翻译单元。顾名思义,链接与链接器有关。您可以在两个不同的源文件中使用具有内部链接的同一标识符,它将引用两个不同的实体。但是,如果一个标识符有外部链接,它应该只定义一次,并且通常可以在多个源文件中用extern声明;所有这些声明都将引用同一实体

如果在块范围(即函数体内部)定义对象变量,则默认情况下,该变量具有自动存储持续时间且无链接。添加关键字static会给它提供静态存储持续时间,因此它存在并在对函数的调用中保留其值。它不会影响标识符的可见性

如果在文件范围(即任何函数体之外)定义对象,则默认情况下该对象具有静态存储持续时间和外部链接。将关键字static添加到定义中不会影响其存储持续时间,但会将其链接从外部更改为内部,从而对其他翻译单元隐藏名称。函数没有存储持续时间,只要程序运行,它们的代码就存在,但静态会以相同的方式影响它们的链接,将其从外部更改为内部


C99为static增加了另一个含义,即数组类型的函数参数,它与其他用途无关。

我认为有必要澄清我们讨论的内容,并尝试使用正确的措辞

const限定符与static关键字无关

从技术上讲,static关键字出现在声明中,它通常是一个存储类说明符,但在C99中,它也可以出现在数组声明器中,尽管这很少见

当它是存储类说明符时,就像在您发布的声明中一样,它会影响标识符文件和已标识对象的存储持续时间生命周期之间的链接可见性,但不会影响标识符的范围

6.2.2标识符的联系 […]在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。[……]

如果对象或函数的文件作用域标识符的声明包含存储类说明符static,则该标识符具有内部链接。30

30函数声明只能在文件范围内包含存储类说明符static;见6.7.1

因此,标识符只能在翻译单元中看到,即在声明它的预处理后的源文件中,无论它是对象还是函数,这可能就是您要寻找的。因此,您可以使用声明私有函数以仅在一个文件中使用

static void foo(void)
{
    // ...
}
static关键字it还与内联函数说明符一起使用,内联函数说明符具有特定的链接语义:

显然,当我们不是在文件范围内,而是在一个更受限制的静态声明中时 在函数内部,链接问题变得无关紧要,因为这样的标识符根本没有链接

6.2.4物品的储存期限 其标识符通过外部或内部链接或存储类说明符static声明为[…]的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次

这一点只适用于对象标识符,它会影响对象的生存期,例如,让变量在调用和初始化之间保留其值

也就是说,这样的对象也是用默认值初始化的

正如我所说,static关键字的用法不太常见:它可以在函数原型中的数组声明器中使用,告诉编译器作为参数给定的数组至少包含n个元素。这是标准的一个修改示例:

void fdouble a[静态3][5]

该声明指定,在任何对f的调用中,与a对应的参数必须是指向至少三个5个双精度数组中第一个数组的非空指针,而其他数组则不是

静态/常量变量是否存储在堆栈/堆上


同样,常量与存储对象的位置无关。标准中没有提到任何关于那个地方的内容,通常有一个专门的区域,但这是一个不同的问题,并且已经得到了回答:

我认为有必要澄清我们所谈论的内容,并尝试使用正确的措辞

const限定符与static关键字无关

从技术上讲,static关键字出现在声明中,它通常是一个存储类说明符,但在C99中,它也可以出现在数组声明器中,尽管这很少见

当它是存储类说明符时,就像在您发布的声明中一样,它会影响标识符文件和已标识对象的存储持续时间生命周期之间的链接可见性,但不会影响标识符的范围

6.2.2标识符的联系 […]在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。[……]

如果对象或函数的文件作用域标识符的声明包含存储类说明符static,则该标识符具有内部链接。30

30函数声明只能在文件范围内包含存储类说明符static;见6.7.1

因此,标识符只能在翻译单元中看到,即在声明它的预处理后的源文件中,无论它是对象还是函数,这可能就是您要寻找的。因此,您可以使用声明私有函数以仅在一个文件中使用

static void foo(void)
{
    // ...
}
static关键字it还与内联函数说明符一起使用,内联函数说明符具有特定的链接语义:

显然,当我们不在文件范围内,而是在一个更受限制的函数内部静态声明中时,链接问题变得无关紧要,因为这样的标识符根本没有链接

6.2.4物品的储存期限 其标识符通过外部或内部链接或存储类说明符static声明为[…]的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次

这一点只适用于对象标识符,它会影响对象的生存期,例如,让变量在调用和初始化之间保留其值

也就是说,这样的对象也是用默认值初始化的

正如我所说,static关键字的用法不太常见:它可以在函数原型中的数组声明器中使用,告诉编译器作为参数给定的数组至少包含n个元素。这是标准的一个修改示例:

void fdouble a[静态3][5]

该声明指定,在任何对f的调用中,与a对应的参数必须是指向至少三个5个双精度数组中第一个数组的非空指针,而其他数组则不是

静态/常量变量是否存储在堆栈/堆上

同样,常量与存储对象的位置无关。标准中没有提到这个地方,通常有一个专门的区域,但这是一个不同的问题,已经回答了:

静态/常量变量是否存储在堆栈/堆上

不,它们是全球空间的一部分。 堆栈和堆用于动态内存分配,而不是静态的

静态/常量变量是否存储在堆栈/堆上

不,它们是全球空间的一部分。 堆栈和堆用于动态内存分配,而不是静态的

C中的static只是指C中变量或函数的范围
它在翻译单元中声明后的范围是什么?你说的“代码”的形式是什么意思?你是说标记为静态的函数吗?我在网上读到,它有三种形式的静态,其中一种是“代码”,我不知道它们是什么ment@AnthonySottile声明中的static关键字如何影响标识符的范围?它会更改存储持续时间和链接。作用域不是由目标和声明的位置决定的吗?根据我的经验,static与globals存储在同一个空间中,既不是heap也不是stack。C中的static只是指变量或函数的作用域,因为它的作用域是在转换单元中声明之后确定的。你说的“代码”形式是什么意思?你是说标记为静态的函数吗?我在网上读到,它有三种形式的静态,其中一种是“代码”,我不知道它们是什么ment@AnthonySottile声明中的static关键字如何影响标识符的范围?它会更改存储持续时间和链接。范围不是由目标和声明的位置决定的吗?根据我的经验,static与globals存储在同一个空间中,既不是heap也不是stack。链接答案应该避免!回避舜@你完全改变了我的答案:D@MarounMaroun我相信是我改变了它:-Pextern和static不控制该函数是否可以更恰当地用于任何其他文件:项目的翻译单元。它们影响标识符在不同翻译单元中使用时是否引用相同的功能。它们不会改变函数,函数仍然可以在其他翻译单元中使用,例如通过传递其地址。extern和static是函数名的属性,而不是函数名的属性。链接答案应该避免!回避舜@你完全改变了我的答案:D@MarounMaroun我相信是我改变了它:-Pextern和static不控制该函数是否可以更恰当地用于任何其他文件:项目的翻译单元。它们影响标识符在不同翻译单元中使用时是否引用相同的功能。它们不会改变函数,函数仍然可以在其他翻译单元中使用,例如通过传递其地址。外部和静态是函数名的属性,而不是函数的属性-不能从同一源文件或翻译单元外部访问静态函数是不正确的。静态影响函数的链接,而不是其可访问性。静态导致函数的标识符名称不具有外部链接,该链接引用的对象与另一个翻译单元中的相同标识符相同,但仍可以通过将其地址传递给其他翻译单元中定义的例程来访问该函数。同样,“范围有限”也不是更好的措辞;静态影响链接,而不是范围。这与静态变量完全不同,无论标识符是指全局变量还是指函数,链接语义都是相同的-不能从同一源文件或翻译单元外部访问静态函数是不正确的。静态影响函数的链接,而不是其可访问性。静态导致函数的标识符名称不具有外部链接,该链接引用的对象与另一个翻译单元中的相同标识符相同,但仍可以通过将其地址传递给其他翻译单元中定义的例程来访问该函数。同样,“范围有限”也不是更好的措辞;静态影响链接,而不是范围。这与静态变量完全不同。不管标识符是指全局变量还是指函数,链接语义都是相同的。