C++ 如何在两个不同项目中的静态变量之间发生链接

标签 c++ linux

我是 C++ linux 的新手,我对它的工作原理有疑问,

标题.h

static int arr [2] [2] = {some values}

lib.cpp - 包含 header.h 文件并创建一个 .so

source.cpp - 包含相同的 header.h 文件(和动态链接 lib.so)并且在链接时抛出 .gnu.linkonce_t 错误

所以,为了避免这种情况,我采用了这种方法,

标题.h

class x {

static int arr [2] [2];
}

lib.cpp - 包含 header.h 文件并创建一个 .so

源.cpp -

int x::arr = {define some values}

包含相同的 header.h 文件并且不会抛出链接错误

最佳答案

首先,你不应该在头文件中定义静态全局变量。在类外部定义变量 static 与在类内部定义变量 static 具有完全不同的含义。这非常令人困惑,但这就是 C++ 的工作方式。

在 C++ 中,关键字 static 至少有四种用法:

1) 类外部的静态全局变量仅对可以正常直接“查看”该变量的代码是全局的,因为它们位于同一个文件中。这使变量成为文件的本地变量。如上所述,您不应将其中之一放在标题中。如果这样做,您将获得同一变量的多个实例。每个包含标题的文件中都有一个。对一个文件的更改不会影响其他文件中的其他文件。

2) 静态全局函数与#1 中的静态全局变量具有相同的含义。一般来说,这意味着该函数只会从声明它的文件中调用。就像静态全局变量一样,如果您在头文件中实现静态全局函数,您最终会在最终可执行文件中得到它的多个拷贝。但是,与静态全局变量不同,如果将静态全局函数定义 放在头文件中,您将无法链接生成的目标文件。

3) 类中的静态变量意味着该类的所有实例都只有该变量的一个拷贝。

4) 类中的静态成员函数只能访问该类中的静态变量。静态成员函数将无法访问所有其他类数据。但是,您可以在没有类实例的情况下调用静态成员函数。例如A::func().

您可能想要的是使用静态类变量或将 extern 定义放在头文件中,如下所示:

extern int arr[2][2];

然后在一个实现文件中实际创建变量实例的地方,作为一个非静态变量,如下所示:

int arr[2][2] = {some values};

确保您理解声明/定义和实例化/实现之间的区别。这些是 C/C++ 中的 keep 概念。

关于C++ 如何在两个不同项目中的静态变量之间发生链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4438762/

相关文章:

c++ - 列表控件在删除键按下时删除行

c++ - 在添加新记录和访问记录时遇到问题

linux - 在 Ubuntu Server (Linux) 中使用 rm 时如何更改错误消息

C++ 通过 Outlook 发送 HTML 邮件

c++ - 将局部变量作为 vector 的成员传递给被调用者

c++ - 为什么使用右值引用时unique_ptr的所有权没有转移?

java - File.createNewFile() 给出 java.io.IOException : Permission denied

linux - 从核心文件中提取调试信息

java - error=2,在 java.lang.ProcessBuilder.start 处没有这样的文件或目录

php - 如何设置一个进程以便它在另一个进程之后执行?