C++:.cpp中"Redeclare"外部命名空间变量



我是新来的C ,并遇到了此代码:

file.h

namespace Type
{
   typedef BOOL (WINAPI *TYCopyFile)
   (
    PCHAR lpExistingFileName,
    PCHAR lpNewFileName,
    BOOL  bFailIfExists
   );
}
namespace Func
{
  extern Types::TYCopyFile pCopyFileA;
}

file.cpp

namespace Funcs
{
  Types::TYCopyFile pCopyFileA;
}
void Init
{
  Funcs::pCopyFileA = (Types::T_CopyFile) GetProcAddress(hKernel32, "CopyFileA");
}

这个想法真的很简单。我有typedef(Types(的命名空间,并在另一个名称空间(Funcs(中创建功能指针作为外部。然后,我在Init功能中的File.cpp中定义了该功能指针。

我遇到的问题是为什么我需要在File.cpp中重新 namespace Funcs?为什么我不能只有Init函数来初始化Funcs::pCopyFileA?据我了解extern,它告诉编译器,该变量存在于某个地方,并告诉链接器找到它。为什么在File.cpp中没有namespace Funcs的链接器找不到它?

对于C 中的所有符号,您都需要A 声明和a defution 。标题文件包含Func::pCopyFileA的声明,源文件包含定义。

如果您在标题文件中定义了变量(即删除extern关键字(,则该定义将在包含标头文件的所有翻译单元中完成。这打破了一个定义规则,链接时会导致多定义错误。

最新更新