tnie / TestDll

学习 dll 导出函数、导出变量
7 stars 1 forks source link

即便不导出类,exe 也可以使用 dll 中类型的默认构造与析构 #17

Closed tnie closed 6 years ago

tnie commented 6 years ago
class /*_ADD_API*/ Student
{
public:
    class Date
    {
    public:
        int year();
        int month();
        int _ADD_API day();
    private:
        long _date;
    };
    /*Student();
    ~Student();*/

    _ADD_API int age();
    bool sex();
    _ADD_API void change(std::string name);
private:
    int m_age;
    bool m_sex;
    std::string m_name;
};

因为使用的编译器自动生成的构造与析构,所以肯定是无法显式导出函数的。

image

经过查看,发现也并未隐式导出。所以推测,类似是在头文件中直接 内联定义 了构造与析构,故 exe 主项目能够直接看到拷贝控制函数。

tnie commented 6 years ago
class _ADD_API Student
{
public:
    class Date
    {
    public:
        int year();
        int month();
        int _ADD_API day();
    private:
        long _date;
    };
    /*Student();
    ~Student();*/

    inline int age();
    bool sex();
    /*_ADD_API*/ void change(std::string name);
private:
    int m_age;
    bool m_sex;
    std::string m_name;
    void do_nothing()
    {
        // inline
    }
};

导出类时,私有成员函数、未显式定义的拷贝控制函数、在类定义头文件中给出了定义的函数(默认内联)也会被导出:但是,前者用户用不到,后两者无需导出用户也能看到。

image

所以,并不推荐导出整个类。虽然代码貌似简洁了,但会导出乱七八糟的好多内容。

13