【发布时间】:2019-09-30 10:09:13
【问题描述】:
我是 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) 中创建函数指针作为extern。然后我在Init函数中定义File.cpp中的函数指针。
我的问题是为什么我需要在File.cpp 中重新声明namespace Funcs?为什么我不能只使用Init 函数来初始化Funcs::pCopyFileA?据我了解extern,它告诉编译器该变量存在于某处并告诉链接器找到它。为什么链接器在File.cpp 中没有namespace Funcs 就找不到它?
【问题讨论】:
-
当您使用
extern时,您承诺在您的翻译单元之一中定义变量。 stackoverflow.com/questions/10422034/when-to-use-extern-in-c -
我在
void Init函数中定义了它们,为什么我在File.cpp中需要namespace Funcs? -
这不是定义,而是分配。 (顺便说一下,这与在全局命名空间中的工作方式相同。)
-
您没有在函数中定义它。您正在分配给它。
-
您承诺定义的实际变量名称是 Funcs::pCopyFileA 命名空间是命名的一部分
标签: c++ windows visual-studio namespaces