c++ - 包含 const 变量并包含在多个文件中的 header 的链接错误?

标签 c++ visual-c++ namespaces constants linker-errors

我正在编写用于测试的代码,其中有一个 TestUtil.h ,它定义了两个常量和一些函数。我将此头文件实现为 TestUtil.cpp,还有第三个文件 ActualTests.cpp,我在其中编写实际测试。 TestUtil.hTestUtil.cpp 只是编写简洁测试的帮助文件。

我有嵌套的命名空间,TestUtil.h 看起来像这样:

namespace SNMPSubAgentTesting {

  namespace MibDataReaderTesting {

     const wchar_t* TEST_MUTEX_NAME = L"TestMutex";

     const wchar_t* TEST_MEMORY_NAME = L"TestMemory";

   //some functions 
   } 
}

在实现TestUtil.cpp中,我包含上面的头文件并给出实现:

#include "TestUtil.h"

 namespace SNMPSubAgentTesting {

  namespace MibDataReaderTesting {
     //implementations
  }
}

在第三个文件 ActualTests.cpp 中,我再次包含 TestUtil.h 以便使用 util 函数:

#include "TestUtil.h"

 namespace SNMPSubAgentTesting {

  namespace MibDataReaderTesting {

     //Test class and tests
  }
}

编译器给出链接错误,并表示 TestUtil.h 中的两个 const 变量已在 TestUtil.cpp 中定义,因此ActualTests.cpp 无法编译。由于 const 变量是内部链接的,并且我们可以将包含 const 变量的 header 包含在多个文件中而不会出现链接错误,为什么在我的情况下它没有链接?是因为嵌套的命名空间吗?

编辑:我正在使用 Microsoft 单元测试框架进行测试。 const 变量位于 MibDataReaderTesting 命名空间中,而不是全局命名空间中。

我的源代码中有头文件,它们包含在多个文件中,并且其中包含 const 变量。在这种情况下没有错误,但对于测试用例它给出了错误。源代码和测试代码之间唯一的区别是测试框架和嵌套命名空间

最佳答案

this internal linkage reference 中所述const 限定名称具有内部链接。

问题是您的名称​​未 const 限定。 const 用于指针指向的数据,而不是变量本身。

您需要在正确的位置添加一个const:

const wchar_t* const TEST_MUTEX_NAME = L"TestMutex";
//             ^^^^^
// Make TEST_MUTEX_NAME itself constant

关于c++ - 包含 const 变量并包含在多个文件中的 header 的链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58874285/

相关文章:

c++ - 嵌入式 linux 上的 getrusage 函数

visual-c++ - 哪个类型库托管 stdDataFormat?

xml - 没有定义前缀的 XML 文档的前缀是什么?

javascript - jQuery 事件命名空间不起作用

php - 使用命名空间并包含一个库

c++ - 将元组的内容作为可变函数参数传递

c++ - 计算文本文件中的行数

javascript - 如何将 C++ 值实时传递给 JS/jQuery?

c++ - VC++ HeapAlloc 内部函数给出空指针

c++ - vc++中如何读取包含\uxxxx的文件