访问另一个 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 之外没有其他翻译单元知道数组大小。
干杯,
调频
我有一个链接到共享库的程序。这个库包含一个 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 之外没有其他翻译单元知道数组大小。
干杯, 调频