c++ - 了解模板函数(在 .h 中的源代码)如何与其编译的 .lib 相关

标签 c++ templates compilation

假设我想向我的 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?
  • Bob 可以更改 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:从你的标题行,他的代码会很好地链接。 (现已测试)

  • 不,编译器无法为 SendData 生成任何有意义的代码。
  • SendDataUnsafe 在您的 .lib 中非常明显。你不能以任何有意义的方式隐藏它。

  • 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/

    相关文章:

    c++ - 为自定义类 std::shared_ptr 实例调用 Operator()

    使用 Plates 进行 Javascript (nodejs) 模板化

    当涉及 std::function 或 lambda 函数时,C++11 不推断类型

    c++ - 将 header 添加到另一个文件时无法编译我的代码

    c++ - 通过软阈值 (C++) 使用 2d Haar 小波变换进行图像去噪

    C++:返回变量的地址?我如何让这个字符串返回,然后将一个小字符串连接到它上面?

    c++ - 准备 C++ Json 请求

    c++ - 编译类型模板谓词使用 Clang 进行编译,但不使用 GCC 或 MSVC

    c - 如何生成 stm32 代码的二进制文件?

    c++ - 没有实现文件时包含头文件?