我是C ++ linux的新手,我对这是如何工作有疑问,
static int arr [2] [2] = {some values}
lib.cpp - 包含header.h文件并创建.so
source.cpp - 包含相同的header.h文件(和dynamicaly链接lib.so)并在链接时抛出.gnu.linkonce_t错误
所以,为了避免这种情况,我采用了这种方法,
class x {
static int arr [2] [2];
}
lib.cpp - 包含header.h文件并创建.so
source.cpp -
int x::arr = {define some values}
包含相同的header.h文件,并且不会抛出链接错误
答案 0 :(得分:1)
像你这样的接缝不知道在标题中声明静态变量会发生什么。
详细了解here。
将静态数组放在类中的解决方案很好,但在某些情况下可能导致静态顺序初始化失败,因此在使用静态类成员变量时必须小心。
如果您更喜欢第一种方式,可以将数组声明为extern变量,并在源文件中定义它。
答案 1 :(得分:1)
首先,您不应该在头文件中定义静态全局变量。在类外部定义变量static与在类中定义静态具有完全不同的含义。这非常令人困惑,但它是C ++的工作方式。
C ++中关键字static至少有四种用法:
1)类外部的静态全局变量只对全局代码可以直接“看到”变量,因为它们位于同一个文件中。这使得变量本地变量。如上所述,您不应将其中一个放入标题中。如果这样,您将获得同一变量的多个实例。每个文件中包含一个标题。对一个的更改不会影响其他文件中的其他文件。
2)静态全局函数与#1中的静态全局变量具有很多相同的含义。一般来说,这意味着只能从声明它的文件中调用该函数。与静态全局变量一样,如果在头文件中实现静态全局函数,最终将在最终可执行文件中使用它的多个副本。但是,与静态全局变量不同,如果在头文件中放置静态全局函数 definition ,则无法链接生成的目标文件。
3)类中的静态变量意味着该类的所有实例只有该变量的一个副本。
4)类中的静态成员函数只能访问该类中的静态变量。静态成员函数无法访问所有其他类数据。但是,您可以在没有类实例的情况下调用静态成员函数。例如A::func()
。
您可能想要的是使用静态类变量或将extern
定义放在头文件中,如下所示:
extern int arr[2][2];
然后在实现文件中的一些实际创建变量实例的地方,作为非静态变量,如下所示:
int arr[2][2] = {some values};
确保您了解声明/定义与实例化/实现之间的区别。这些是用C / C ++保存概念。