【问题标题】:Trying to create an error log ofstream -- getting "one or more multiply defined symbols found"试图创建一个错误日志 ofstream - 得到“找到一个或多个多重定义的符号”
【发布时间】:2012-06-18 20:00:16
【问题描述】:

我正在尝试这样做:

#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 的替代方法)而我不是?

【问题讨论】:

  • 无需编辑您的帖子以包含“分辨率”文本。只需接受最佳答案。这足以说明 SO。
  • 我试图避免给那些提供侮辱性答案的人“因果报应”。第二个比第一个差,所以我会接受那个。
  • 如果您对答案不满意,则无需接受。发布您认为可能更好的答案,并向他们解释您不满意的原因。
  • @K-ballo 的回答以何种方式“侮辱”?国际海事组织你接受了错误的。

标签: c++


【解决方案1】:

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

来源

std::ofstream ErrorLog;

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

标题

extern std::ofstream ErrorLog;

void InitErrorLog(std::string FileName);

此外,为了将您的函数保留在标题中,您必须将其设为 inline

【讨论】:

  • @Luchian Grigore:static 流不会导致每个翻译单元的实例不同吗?
  • 现在好多了,因为ErrorLog应该extern,而不是static
【解决方案2】:

您违反了单一定义规则。您需要将方法设为inline

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

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

【讨论】:

  • 这是我要问的第二点,比第一点要多得多;我可能应该在发布之前从我试图做的事情中删除该功能,以避免引起过度关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多