C语言中的static和C++语言中的static之间的区别是什么?

29 浏览
0 Comments

C语言中的static和C++语言中的static之间的区别是什么?

在C和C++中,static关键字有什么区别?

admin 更改状态以发布 2023年5月23日
0
0 Comments

在C++中,文件作用域中使用static限制访问当前翻译单元的做法已经被废弃,但在C语言中仍然被接受。

相反,可以使用未命名命名空间。

namespace
{
    int file_scope_x;
}

以这种方式声明的变量只能在该文件内部使用,就像声明为static一样。

废弃的主要原因是为了消除static关键字过载的含义之一。

最初,它意味着在函数中声明的变量将为程序生存期分配存储空间,并且不像函数局部变量通常存储在堆栈上。

然后,关键字被重载以应用于文件作用域链接。根据需要制定新关键字并不理想,因为它们可能会破坏现有代码。因此,这个关键字再次被使用具有不同的含义而不会导致冲突,因为声明为static的变量不能同时在函数内部和顶层,在函数之前也没有该修饰符。(当引用函数时,存储的含义完全丢失,因为它们不存储在任何地方。)

当C++中出现类定义(以及Java和C#)时,关键字再次被使用,但含义至少更接近最初的意图。以这种方式声明的变量存储在全局区域中,而不是像函数变量一样存储在堆栈上,或像对象成员一样存储在堆上。因为变量不能同时位于顶层和类定义内,所以额外的含义可以明确地附加到类变量上。它们只能通过类名或在该类的对象内部引用。

0
0 Comments

static 关键字在 C 和 C++ 中都有相同的作用。

  1. 当在文件级别上使用(在函数外部),它会设置应用于其上的项的可见性。静态项在它们的编译单元外部是不可见的(例如在链接器中)。它们的持续时间与程序的持续时间相同。

    这些文件级别的项(函数和数据)应该是静态的,除非有特别需要从外部访问它们(几乎不需要直接访问数据,因为这会破坏封装的核心原则)。

    如果(如您对问题的评论所指示的那样)这是您关心的唯一使用 static 的方式,那么在 C 和 C++ 之间没有区别。

  2. 当在函数内部使用时,它设置项目的持续时间。同样,持续时间与程序相同,并且该项在该函数的调用之间继续存在。

    它不会影响该项的可见性,因为它仅在函数内部可见。一个例子是需要在调用之间保留其种子值的随机数生成器,但不希望该值对其他函数可见。

  3. C++ 有一个额外的用途,在类中使用 static。当在那里使用时,它成为一个单个类变量,对该类的所有对象都是公共的。一个经典的例子是为给定类存储已被实例化的对象数。

正如其他人指出的那样,文件级别的静态使用已经被取消使用,而是使用无名称的命名空间。然而,我相信在语言中实际上删除它之前还需要一段很长时间 - 在目前有太多使用它的代码。而 ISO C 仅仅是在最近才删除了 gets(),尽管我们所有人都知道它是一个危险的函数。

即使它已被声明过时,这也不会改变它的语义。

0