假设我想向我的 friend Bob 发送一个 C++ 类(没有源代码)。我会给他发送一个编译好的.lib 和给定的 MyClass.h:
class MyClass {
public:
/// Public template function for safety of size, implementation in .h
template <class T>
static int SendData(const T& data) {
return SendDataUnsafe(&data, sizeof(T));
};
private:
/// Private function with risky size, code implementation in .cpp and compiled in .lib
static int SendDataUnsafe(PCVOID data, size_t data_size);
};
我了解
SendDataUnsafe
的源代码在 MyClass.cpp 中被编译并部分链接到 MyClass64.lib (示例)。由于它是私有(private)的,Bob 的编译器不会让他调用 SendDataUnsafe
直接( Unresolved external )。所以 Bob 必须使用模板化的 SendData
反而。但我有一些问题:SendData
的汇编?模板到 .lib 中,因为实现完全在 .h? SendData
的源代码吗? (在 .h 中)并替换 sizeof(T)
通过其他方式间接访问 SendDataUnsafe
? 编辑:如果 Bob 删除了
private:
声明并尝试调用 SendDataUnsafe
,他得到一个错误(这似乎与目前收到的评论相矛盾):ERROR, LNK2019, unresolved external symbol "public: static int MyClass::SendDataUnsafe(void const *,unsigned __int64)" (...) referenced in function main
最佳答案
Bob 绝对可以调用您的私有(private)函数。 private 是编译时编译器强制执行的限制。我猜 Bob 是否要删除 private:
从你的标题行,他的代码会很好地链接。 (现已测试)
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
似乎支持这样的结论,即损坏的名称不包括对私有(private)成员的任何提及。
Bob 还可以在您的 .h 文件中添加一个新函数,并根据自己的喜好调用私有(private)成员。
关于c++ - 了解模板函数(在 .h 中的源代码)如何与其编译的 .lib 相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61786646/