Я новичок в 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
) как extern. Затем я определяю этот указатель на функцию в File.cpp
в функции Init
.
Вопрос, который у меня возникает, заключается в том, почему мне нужно переопределить namespace Funcs
в File.cpp
? Почему я не могу просто использовать функцию Init
, которая инициализирует Funcs::pCopyFileA
? Как я понимаю extern
, он сообщает компилятору, что переменная где-то существует, и указывает компоновщику найти его. Почему компоновщик не может найти его без namespace Funcs
в File.cpp
?