首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在另一个文件中初始化的extern数组中未定义的引用

在另一个文件中初始化的extern数组中未定义的引用
EN

Stack Overflow用户
提问于 2019-10-08 16:54:36
回答 1查看 257关注 0票数 1

我对C++相当陌生,我很难理解如何声明整个应用程序范围内存在的变量。

因此,我声明一个extern数组,然后将其初始化委托给适当的cpp文件(trigonometry.cpp)。按照我调用这个初始化函数的逻辑,这些外部数组应该无处不在并具有值。但很明显事情不是这样的。

下面是相关代码。

错误输出:

代码语言:javascript
运行
复制
player.o: In function `Player::yDirection() const':
player.cpp:(.text+0x97): undefined reference to `Trigonometry::fSinTable'

头文件,其中声明了extern变量。

代码语言:javascript
运行
复制
// trigonometry.hpp

namespace Trigonometry
{

extern double fSinTable[Config::ANGLE360 + 1];

bool load();
}; // namespace Trigonometry

输入fSinTable值的函数

代码语言:javascript
运行
复制
// trigonometry.cpp

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        double fSinTable[i] = {std::sin(radian)};
    }
    return 0;
}

我试图访问数组的类

代码语言:javascript
运行
复制
// player.cpp

#include "trigonometry.hpp"
#include "player.hpp"

const double &Player::yDirection() const
{
    return Trigonometry::fSinTable[_rotation];
}

以及我的主类,在这里我尝试先调用初始化函数,然后再调用其他函数。

代码语言:javascript
运行
复制
// main.cpp

#include "config.hpp"
#include "trigonometry.hpp"
#include "player.hpp"

// ...

// This executes before &Player::yDirection(), so I would expect Trigonometry::fSinTable to be initialized
bool loaded = Trigonometry::load();

Player *player;

int main(int argc, char *argv[])
{
   player = new Player();
}

编辑:

我是这样构建应用程序的:

代码语言:javascript
运行
复制
g++    -c -o trigonometry.o trigonometry.cpp
g++    -c -o player.o player.cpp
g++    -c -o main.o main.cpp
g++ -o App trigonometry.o player.o main.o
EN

回答 1

Stack Overflow用户

发布于 2019-10-08 17:25:52

我发现我的错误并没有在任何地方定义fSinTable

我错误地定义了数组的每个子数组,而不是整个数组。

因此,从这一点来看:

代码语言:javascript
运行
复制
// trigonometry.cpp

#include "trigonometry.hpp"

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        double fSinTable[i] = {std::sin(radian)};
    }
    return 0;
}

对此:

代码语言:javascript
运行
复制
// trigonometry.cpp

#include "trigonometry.hpp"

double Trigonometry::fSinTable[Config::ANGLE360 + 1];

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        fSinTable[i] = std::sin(radian);
    }

    return true;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58290807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档