首页 > 解决方案 > c++:“重新声明”.cpp 中的外部命名空间变量

问题描述

我是 C++ 新手,遇到了这段代码:

文件.h

namespace Type
{
   typedef BOOL (WINAPI *TYCopyFile)
   (
    PCHAR lpExistingFileName,
    PCHAR lpNewFileName,
    BOOL  bFailIfExists
   );
}

namespace Func
{
  extern Types::TYCopyFile pCopyFileA;
}

文件.cpp

namespace Funcs
{
  Types::TYCopyFile pCopyFileA;
}

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

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

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

标签: c++windowsvisual-studionamespaces

解决方案


对于 C++ 中的所有符号,您都需要声明定义。头文件包含 的声明Func::pCopyFileA,源文件包含定义。

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


推荐阅读