标头中的数组

Arrays in headers

本文关键字:数组      更新时间:2023-10-16

以下问题是我项目的一小部分。我已经简化了很多问题。

我已经全局声明了数组大小和数组。

int N;
double array[N];

现在使用一个函数,我正在填充数组。

void arrayfill()
{
    for(int i=0;i<N;i++)
    {
        array[i] = i;
    }
}

接下来,我有一个函数,它根据变量 var 对所有数组的元素求和。

double sum(int var)
{
    double s;
    for(int i=0;i<var;i++)
    {
        s+=array[i];
    }
    return s;
}

现在,我想要的是创建一个具有填充函数的头文件,另一个具有 sum 函数的头文件,最后从我想调用 sum(( 的主函数。我这样做的原因是因为我想填充数组一次,并在许多不同的地方继续使用不同的 var 值的 sum((。

有人可以帮忙吗?

这是一种方法。

array.h:

extern const int N;
extern double array[];

arrayfill.h:

void arrayfill();

arraysum.h:

double sum(int var);

主.cpp:

#include "arrayfill.h"
#include "arraysum.h"
int main()
{
   arrayfill();
   double s = sum(10);
   return 0;
}

数组.cpp:

#include "array.h"
const int N = 200;
double array[N];

数组填充.cpp:

#include "array.h"
#include "arrayfill.h"
void arrayfill()
{
    for(int i=0;i<N;i++)
    {
        array[i] = i;
    }
}

数组总和.cpp:

#include "array.h"
#include "arraysum.h"
double sum(int var)
{
   double s = 0.0;
   for(int i=0;i<var;i++)
   {
      s+=array[i];
   }
   return s;
}

使用 g++ 构建程序:

g++ -c array.cpp
g++ -c arrayfill.cpp
g++ -c arraysum.cpp
g++ -c main.cpp
g++ -o arraytest array.o arrayfill.o arraysum.o main.o

在你的标题中,你写道你声明了数组:

// header.h
int N;
double array[N];

这些都不是宣言。 它们都是定义。 要在标头中声明变量,请使用 extern 关键字:

// header.h
extern int N;
extern double array[N];

此外,除非N是常量,否则不能用作数组的大小,因此我们需要声明N externconst

// header.h
extern int const N;
extern double array[N];

在一个源文件中,必须定义Narray的存储:

// source.cpp
int const N = 10;
double array[N];

在标头中,为要使用的函数添加声明:

// header.h
// ...as before
void arrayfill();
double sum(int var);

这些是函数声明,而不是定义。 在一个源文件中,您将按照编写它们来放置它们的定义。

您必须在标头中声明数组并拥有一个.cpp文件,您可以在其中定义它:

whatever.h

extern const size_t N = 42;
extern int array[N];

whatever.cpp

include "whatever.h"
int array[N];

当编译器只读取包含文件时,它只会注意到,在某个地方有一个大小为 N 的数组。只有当你编译whatever.cpp编译器才会在数据部分实际生成array。因此,链接的应用程序中只有一个数组,尽管您从许多不同的位置引用它。