什么是“静态”功能?

问题是关于纯c函数,而不是c ++ static方法,正如评论中所阐明的那样。

好吧,我明白什么是static变量,但什么是static函数?

为什么如果我声明一个函数,让我们假设void print_matrix ,让我们说ac (没有ah ),并包括"ac" - 我得到了"print_matrix@@....) already defined in a.obj" ,但是,如果我声明它为static void print_matrix那么它编译?

更新只是为了清除一些事情 - 我知道包括.c在内的很糟糕,正如你们许多人指出的那样。 我只是暂时清除main.c空间,直到我更好地了解如何将所有这些函数组合到适当的.h.c文件中。 只是一个临时的快速解决方案。


static函数是仅对同一文件中的其他函数(更确切地说是相同的翻译单元)可见的函数。

编辑 :对于那些认为,问题的作者意味着'类方法'的人:因为问题被标记为C他意味着一个普通的旧C函数。 对于(C ++ / Java / ...)类方法, static意味着可以在类本身上调用此方法,而不需要该类的实例。


C中的静态函数和C ++中的静态成员函数有很大的区别。 在C中,一个静态函数在其翻译单元之外是不可见的,这是它被编译到的目标文件。 换句话说,使一个函数静态限制它的范围。 你可以将一个静态函数想象为对它的* .c文件“私有”(尽管这不是严格正确的)。

在C ++中,“static”也可以应用于类的成员函数和数据成员。 静态数据成员也称为“类变量”,而非静态数据成员是“实例变量”。 这是Smalltalk术语。 这意味着只有一个静态数据成员的副本由一个类的所有对象共享,而每个对象都有自己的非静态数据成员副本。 所以一个静态数据成员本质上是一个全局变量,它是一个类的成员。

非静态成员函数可以访问类的所有数据成员:静态和非静态。 静态成员函数只能对静态数据成员进行操作。

考虑这一点的一种方式是在C ++中静态数据成员和静态成员函数不属于任何对象,而是属于整个类。


关于C ++中的函数,关键字static有两种用法。

首先是将该功能标记为具有内部链接,因此不能在其他翻译单元中引用。 这个用法在C ++中被弃用。 未命名的命名空间是此用法的首选。

// inside some .cpp file:

static void foo();    // old "C" way of having internal linkage

// C++ way:
namespace
{
   void this_function_has_internal_linkage()
   {
      // ...
   }
}

第二种用法是在一个类的上下文中。 如果一个类有一个静态成员函数,这意味着该函数是该类的成员(并且对其他成员具有通常的访问权限),但它不需要通过特定对象调用。 换句话说,在该函数内部,不存在“this”指针。

链接地址: http://www.djcxy.com/p/17295.html

上一篇: What is a "static" function?

下一篇: Should private helper methods be static if they can be static