我是新来的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
关键字(,则该定义将在包含标头文件的所有翻译单元中完成。这打破了一个定义规则,链接时会导致多定义错误。