header 包含 const 变量并包含在多个文件中的链接错误?
Linkage error for a header containing const variables and included in multiple files?
我正在编写测试代码,其中我有一个 TestUtil.h
,它定义了两个常量和一些函数。我将此 header 文件实现为 TestUtil.cpp
,并且还有第三个文件 ActualTests.cpp
,我正在其中编写实际测试。 TestUtil.h
和 TestUtil.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
我包含上面的 header 文件并给出实现:
#include "TestUtil.h"
namespace SNMPSubAgentTesting {
namespace MibDataReaderTesting {
//implementations
}
}
在第三个文件 ActualTests.cpp
中,我再次包含 TestUtil.h
以便使用 util 函数:
#include "TestUtil.h"
namespace SNMPSubAgentTesting {
namespace MibDataReaderTesting {
//Test class and tests
}
}
编译器给出了一个linkage 错误,并说 TestUtil.h
中的两个 const
变量已经在 TestUtil.cpp
中定义,因此 ActualTests.cpp
不能被编译。由于 const
变量在内部被 linked 并且我们可以在多个文件中包含包含 const
变量的 header 而不会出现 linking 错误,为什么它不 link 就我而言?是因为嵌套的命名空间吗?
编辑:我正在使用 Microsoft 单元测试框架进行测试。
const 变量在 MibDataReaderTesting 命名空间中,而不是在全局命名空间中。
我的源代码中有 header 个文件,这些文件包含在多个文件中,并且其中有 const 变量。在这种情况下没有错误,但对于测试用例,它给出了错误。唯一的区别b/w 源代码和测试代码是测试框架和嵌套命名空间
如 this internal linkage reference const
中所述,限定名称具有内部链接。
问题是您的名字不 const
合格。 const
用于指针指向的数据,而不是变量本身。
您需要在正确的位置添加一个const
:
const wchar_t* const TEST_MUTEX_NAME = L"TestMutex";
// ^^^^^
// Make TEST_MUTEX_NAME itself constant
我正在编写测试代码,其中我有一个 TestUtil.h
,它定义了两个常量和一些函数。我将此 header 文件实现为 TestUtil.cpp
,并且还有第三个文件 ActualTests.cpp
,我正在其中编写实际测试。 TestUtil.h
和 TestUtil.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
我包含上面的 header 文件并给出实现:
#include "TestUtil.h"
namespace SNMPSubAgentTesting {
namespace MibDataReaderTesting {
//implementations
}
}
在第三个文件 ActualTests.cpp
中,我再次包含 TestUtil.h
以便使用 util 函数:
#include "TestUtil.h"
namespace SNMPSubAgentTesting {
namespace MibDataReaderTesting {
//Test class and tests
}
}
编译器给出了一个linkage 错误,并说 TestUtil.h
中的两个 const
变量已经在 TestUtil.cpp
中定义,因此 ActualTests.cpp
不能被编译。由于 const
变量在内部被 linked 并且我们可以在多个文件中包含包含 const
变量的 header 而不会出现 linking 错误,为什么它不 link 就我而言?是因为嵌套的命名空间吗?
编辑:我正在使用 Microsoft 单元测试框架进行测试。 const 变量在 MibDataReaderTesting 命名空间中,而不是在全局命名空间中。
我的源代码中有 header 个文件,这些文件包含在多个文件中,并且其中有 const 变量。在这种情况下没有错误,但对于测试用例,它给出了错误。唯一的区别b/w 源代码和测试代码是测试框架和嵌套命名空间
如 this internal linkage reference const
中所述,限定名称具有内部链接。
问题是您的名字不 const
合格。 const
用于指针指向的数据,而不是变量本身。
您需要在正确的位置添加一个const
:
const wchar_t* const TEST_MUTEX_NAME = L"TestMutex";
// ^^^^^
// Make TEST_MUTEX_NAME itself constant