访问另一个 cxx 文件中定义的静态数组

Access a static array defined in another cxx file

我有一个链接到共享库的程序。这个库包含一个 RandomFile.cxx 文件,它有一个像这样的数组定义:

static double randomArray[] = {0.1, 0.2, 0.3};

在 RandomFile.cxx 的头文件 RandomFile.hxx 中,没有 extern,getter 或任何关于 randomArray 的东西。

在我的程序中,我想以某种方式访问​​这个数组。

到目前为止我已经尝试过:

// sizeOfRandomArray was calculated by counting the elements.
int sizeOfRandomArray = 3;

// 1st attempt: does not compile because of undefined reference to the array
extern double randomArray[sizeOfRandomArray];

// 2nd attempt: does not compile because of undefined reference to the array
extern "C" double randomArray[sizeOfRandomArray];

// 3rd attempt: does not compile because of undefined reference to the array
extern "C++" double randomArray[sizeOfRandomArray];

// 4th attempt: compiles but i don't get the actual values
extern "C" {
double randomArray[sizeOfRandomArray];  
}

// 5th attempt: compiles but i don't get the actual values
extern "C++" {
double randomArray[sizeOfRandomArray];
}

// 6th attempt: compiles and works but I overload my code with the whole RandomFile.cxx file.
#include "RandomFile.cxx"

我不能(不想)更改 RandomFile.cxx,因为它是名为 VTK.

的大型图书馆的一部分

有什么方法可以做到这一点,而无需在我的代码中包含 cxx 文件或复制数组?

提前致谢。

static linkage in one translation unit 定义的变量(在某种程度上)是该翻译单元的“私有”变量。

没有其他翻译单元可以访问该变量。

所以不,不可能直接访问该数组。

作为 work-around,您可以考虑创建一个 class,并将数组放在 class 中。然后,您可以使用 member-functions 以间接方式访问 class。如果您只想要数组的一个实例(而不是 class 的每个对象实例一个),那么您可以在 class.

中将其设为 static

如果不修改 RandomFile.cxx,您将无法访问该对象。 只需删除 RandomFile.cxx 文件中的 static 说明符,并在公共头 RandomFile.hxx 或需要访问的目标翻译单元中将对象声明为 extern。这使得对象具有外部链接的静态持续时间:

RandomFile.hxx:

 constexpr int sizeOfRandomArray=3
 extern double randomArray[sizeOfRandomArray];

RandomFile.cxx:

 double randomArray[sizeOfRandomArray] {1,2,3};

见: https://en.cppreference.com/w/cpp/language/storage_duration

请记住,如果您在声明中遗漏了大小,除了 RandomFile.cxx 之外没有其他翻译单元知道数组大小。

干杯, 调频