在内存中为多个文件c ++保存构造的静态数组

时间:2015-05-08 12:35:58

标签: c++ arrays dll linker

我有一些数组需要在程序期间保存在内存中。这些数组被用作不同文件的查找引用,所以我认为我应该创建一个DLL来保存它们。

我似乎遇到的主要问题是文件必须在程序开头构建。这些数组每个都有几千个值,未来的数据可能有数百万个,因此不能选择对数组进行硬编码。

这是我最好的尝试:

首先,我制作了Dll头文件。我读到了关于创建静态构造函数的问题,这就是我在这里要做的事情来保存数组。我只将导出放在NumCalc类上(对吗?)。

// TablesDll.h
#ifndef TABLESDLL_EXPORTS
#define TABLESDLL_EXPORTS

#ifdef TABLESDLL_EXPORTS
    #define TABLESDLL_API __declspec(dllexport) 
#else
#define TABLESDLL_API __declspec(dllimport) 

#endif

namespace tables
{
    class Arrays
    {
    public:
        static const int* arr;

    private:
        static int* SetNums();

    };

    class TABLESDLL_API NumCalc
    {
    public:
        static Arrays arrays;
    };
}


#endif

现在定义:

// TablesDll.cpp
#include "stdafx.h"
#include "TablesDll.h"
#include <stdexcept>   (<- I don't know why this is here...)

namespace tables
{   
    const int* Arrays::arr = SetNums();

    int* Arrays::SetNums()
    {
        int* arr= new int[2000];
        /* set the numbers*/
        return arr;
    }
}

编译好。我把文件拿到测试程序中,如下:

// TestTablesDll
#include "stdafx.h"
#include "TablesDll.h"
using namespace tables;

int _tmain(int argc, _TCHAR* argv[])
{
    for(int i=0; i<299; i++)
        printf("arr[%i] = %d/n", i, NumCalc::arrays::arr[i]);

    return 0;
}

不幸的是,这甚至都没有编译。

error C3083: 'arrays': the symbol to the left of a '::' must be a type

我以前的尝试没有使用静态构造函数。没有班级阵列。 NumCalc是唯一一个包含

的类
static TABLESDLL_API const int* arr

和私人功能

static const int* SetNums().

这产生了LNK2001 compiler error when run in the TestTablesDll

我很确定该函数在编译时没有运行,而且arr变量未定义。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

TablesDll.h中,您应该TABLESDLL_API加入Arrays课程。否则,您将无法使用依赖于NumCalc的{​​{1}}部分。

即使Arrays是一个空类,你也应该在Arrays NumCalc::arrays;中使用TablesDll.cpp - Arrays必须在某处定义(并且不仅仅在类定义中声明) )。

编辑:还有更多问题。

arrays应该像这样访问:arr - NumCalc::arrays.arr而不是.

此外,标题始终会导出符号,因为您定义了::,然后检查它是否已定义。这应该是这样的:

TABLESDLL_EXPORTS

并且在#ifndef TABLESDLL_HEADER_GUARD #define TABLESDLL_HEADER_GUARD #ifdef TABLESDLL_EXPORTS #define TABLESDLL_API __declspec(dllexport) #else #define TABLESDLL_API __declspec(dllimport) #endif 中您应该在包含标头之前定义TablesDll.cpp - 这样只有 dll 导出符号,并且可执行文件会导入它们。像这样:

TABLESDLL_EXPORTS