8

我正在查看我目前工作的公司中的一些代码,我在*.cpp文件中看到了一些(不是很多)静态全局变量声明(例如,存储侦听器列表),其中.h/.cpp文件属于一个类. 如果仅由类本身使用的变量(静态或其他),我总是将其声明为私有。

这比声明变量私有有优势吗?这是不好的做法吗?或者在声明仅由类使用而没有其他人使用的静态变量时这是否正常?

编辑:在我的问题中,我询问了静态,但是如果它是文件中的非静态全局变量.cpp而不是类的私有成员怎么办?这是不好的做法还是被认为可以?在这种情况下有什么优势吗?

4

6 回答 6

7

从风格的角度来看,这可能会,也可能不会,但风格是主观的。

从技术角度来看,有几个区别:

                             +----------------+-------------+
                             | Private Static | File Static |
+----------------------------+----------------+-------------+
|   Visible by includers     |       Yes      |     No      |
+----------------------------+----------------+-------------+
|   Accessible to friend     |       Yes      |     No      |
+----------------------------+----------------+-------------+
|  Accessible to all in TU*  |       No       |     Yes     |
+----------------------------+----------------+-------------+
| Require #include in header |       Yes      |     No      |
+----------------------------+----------------+-------------+

*TU: Translation Unit (roughly put: the source file after include resolution)

因此,从技术上讲,static文件范围内的变量(或匿名命名空间中的变量)可以更加私有,除非它对源文件中跟随它的所有代码可见(这会在一定程度上改变可访问性)。

出于这些客观原因,我个人更喜欢它们。我倾向于让我的标题尽可能地为空,因为它使更改对客户端没有影响更容易(而且我大多数时候都是客户端!)

注意:如果我忘记了差异,请告诉/编辑

于 2011-03-28T19:15:26.227 回答
5

这种方式的主要优点是减少了 *.h 文件中“不必要的”东西的数量。这可能会稍微改善文件或修改时的编译时间和/或重建复杂性,并且可能会使头文件更易于阅读。

(在我看来,这些优势很小,我通常更喜欢将逻辑上与某个类相关的事物放在该类的范围内的清晰性。)

但是,静态全局变量在 C++ 中已被弃用并且是不好的做法。如果没有其他合适的范围,则应使用匿名命名空间。

// Instead of this:
static std::list<MyClass*> MyClass_population;

// Do this:
namespace { // anonymous
    std::list<MyClass*> MyClass_population;
}
于 2011-03-28T18:27:15.610 回答
0

仅当您希望变量在该文件中可用时,静态才意味着,对于私有,它仅意味着在该类中。在某些情况下,它们的作用大致相同,但我倾向于首先选择静态,因为它是编译时变量而不是运行时自动变量。尽管这确实取决于编译器优化。

于 2011-03-28T18:20:03.930 回答
0

当我想在驻留在同一文件中的类之间共享一个函数或变量时,我通常会这样做。在 Java 中,我认为这可以(我在这里猜测)通过内部类来实现。只要头文件的外部用户可见界面不依赖于它们,我认为它是无害的。

于 2011-03-28T18:21:20.713 回答
0

没有static全局变量之类的东西:您正在查看的是static具有文件范围的变量。(至少,我的 C++ 老师没有将这些称为全局;我不确定标准如何称呼这些。)

但是,它们具有全局变量的所有优点和全局变量的所有缺点,除了一个:如果它们具有相同的名称,它们就不会相互冲突。

例如,以下内容不会链接:

// in a.cpp
static int a;
int b;

// in a.cpp
static int a;
int b;

因为全局符号b出现两次。a,但是,没有问题。

static类变量的区别在于它们出现在标头中,因此更改、删除或添加它们需要重新编译所有客户端代码。

于 2011-03-28T18:22:20.317 回答
0

和你一样,我通常更喜欢class static在文件中使用 a 而不是文件中.h的全局。static.cpp

但是,有一次我更喜欢全局static. 这是当它避免需要在文件中具有#include指令(访问static变量类型的声明)时.h

于 2011-03-28T18:26:54.473 回答