如何模拟extern数组?

时间:2016-10-17 11:38:18

标签: c++ arrays c++11 c++14

我创建了一个代码文件来保存我的所有全局变量,其中一个是像这样的数组:

global.cpp

#include <array>

array<string, 3> arr = {"value1", "value2","value3"};

我在另一个代码文件中测试数组值,如下所示:

testarrays.cpp

#include <iostream>
#include <array>

template <size_t N>
void TestingArrays(const array<string, N>& ArrT);

void ArrayTester()
{
     extern array<string,3> arr;

     array <string, 2> localarr = {"v1" ,"v2"};

     TestingArrays(localarr);
     TestingArrays(arr);
}

template <size_t N>
void TestingArrays(const array<string, N>& ArrT) 
{
     for (auto it = ArrT.cbegin(); it != ArrT.cend(); ++it)
     {
         cout << "Testing " << *it << endl;
     }
}

除了一件事,一切都很美好。我在许多其他地方使用这个全局数组(Arr)。

这意味着如果我需要更改变量的数量(在这个例子中它有3个)我需要在所有代码文件上做同样的事情...... ...疯狂......

我想用这样的模板:

testarrays.cpp

...
     template <size_t N>
     extern array<string,N> arr;
...

......但它没有编译。

有人有提示解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

using声明可以让这更容易。然后,您可以在多个位置使用myArr,但只更改一次大小:

//header.h
#include <array>
#include <string>

using myArr = std::array<std::string, 3>;

extern myArr arr;

接下来将global的定义放在一个新文件中:

//myarr.cpp
#include "header.h"

myArr arr = {"value1", "value2","value3"};

最后在其他编译单元(.cpp文件)中使用它:

//main.cpp
#include "header.h"

#include <iostream>
#include <array>

template <size_t N>
void TestingArrays(const std::array<std::string, N>& ArrT);

void ArrayTester()
{
    //extern array<string, 3> arr; // global var doesn't need to be declared here if the header is included

    std::array<std::string, 2> localarr = {"v1" ,"v2"};

    TestingArrays(localarr);
    TestingArrays(arr);
}

template <size_t N>
void TestingArrays(const std::array<std::string, N>& ArrT)
{
    for(auto it = ArrT.cbegin(); it != ArrT.cend(); ++it)
    {
        std::cout << "Testing " << *it << std::endl;
    }
}

int main() {
    auto value = arr[1];
    ArrayTester();
    return 0;
}

答案 1 :(得分:1)

使用前向声明创建头文件:

#pragma once
#include <array>
#include <string>

extern std::array<std::string, 3> arr;

并将其包含在您需要的地方:

#include"arr.h"
...
void ArrayTester()
{
     array <string, 2> localarr = {"v1" ,"v2"};

     TestingArrays(localarr);
     TestingArrays(arr);
}