gpt4 book ai didi

c++ - 命名空间外部变量的 undefined reference /多重定义,C++ 结构化问题

转载 作者:行者123 更新时间:2023-11-28 02:57:51 24 4
gpt4 key购买 nike

我正在创建一个命名空间来帮助我调试程序,但我在弄清楚如何构造所有内容并使其顺利构建时遇到了问题。

这是我当前的标题:

#ifndef HELPER_H
#define HELPER_H
#include <string>
#include <fstream>
#include <sstream>

namespace Helper
{
enum LOG { ONSCREEN, OFFSCREEN };
extern std::ofstream logfile;
//std::ofstream logfile("log.txt", std::ios_base::out | std::ios_base::app );


void EnableLogging();
void Log(std::string s, LOG type);

template <class T>
std::string ToString(const T& t)
{
std::ostringstream sstr;
sstr << t;
return sstr.str();
}
}

#endif // HELPER_H

这是帮助程序 cpp 文件:

#include "Helper.h"
#include <cstdio>

void Helper::EnableLogging()
{
#ifdef WIN32
// To use console on pc
std::ofstream ctt("CON");
freopen("CON", "w", stdout);
freopen("CON", "w", stderr);
#endif
#ifdef GP2X
//To log to text file on the caanoo
logfile.open("log.txt", std::ios_base::out | std::ios_base::app );
#endif

}

void Helper::Log(std::string s, LOG type)
{
if(type == OFFSCREEN)
{
#ifdef GP2X
//log << "L" << __LINE__ << "|T" << SDL_GetTicks() << "| " << s << std::endl;
logfile << s << std::endl;
#endif
#ifdef WIN32
printf("%s",s.c_str());
#endif
}
}

目前我收到一个undefined reference to Helper::logfile 错误,我完全理解这是因为我使用了 extern 关键字。

如果没有 extern 关键字,我会得到一个不同的错误:multiple definition of Helper::logfile 。该错误在我尝试在其中包含“Helper.h” 的另一个源文件中报告为'first defined..'。报告错误的行号是所述源文件中的构造函数,但我怀疑这与任何事情都没有关系。

我确定我构建的辅助代码对于编译是错误的,但我不知道我应该怎么做?

最佳答案

您需要在 header 中声明该变量,就像您所做的那样,以使该名称在任何需要的地方可用。

// Helper.h
extern std::ofstream logfile;

您需要在源文件中定义它;单一定义规则要求您只有一个定义。

// Helper.cpp
std::ofstream Helper::logfile("log.txt", std::ios_base::out | std::ios_base::app );

没有定义,变量不存在,因此出现“ undefined reference ”错误。

如果在 header 中定义,它会在包含 header 的每个翻译单元中定义,因此会出现“多重定义”错误。

在一个源文件中定义一次,链接器很高兴。

关于c++ - 命名空间外部变量的 undefined reference /多重定义,C++ 结构化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21580883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com