0

我正在尝试这样做:

#pragma once
#include <fstream>
#include <string>

static std::ofstream ErrorLog;

void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

但是在多个 CPP 文件中 #include 时出现“找到一个或多个多重定义的符号”错误。STL 在做什么(提供 cout、cin、cerr 等——这种方法最初是作为重定向 cerr 的替代方法)而我不是?

4

2 回答 2

4

您在头文件中提供定义。相反,在源文件中定义它并在标题处留下一个extern 声明。ErrorLog

来源

std::ofstream ErrorLog;

void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

标题

extern std::ofstream ErrorLog;

void InitErrorLog(std::string FileName);

另外,为了将您的功能保持在标题中,您必须制作它inline

于 2012-06-18T20:03:29.063 回答
2

你打破了单一定义规则。你需要制作方法inline

inline void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

另外,请注意,通过声明您的变量static,您将拥有每个翻译单元的副本——即它不是全局的。要使其全局化,您需要extern在标头中声明它并在单个实现文件中定义它。

于 2012-06-18T20:03:25.817 回答