在向前声明类时,我是否也应该使用属性定义?

时间:2017-06-16 14:16:57

标签: c++ class forward-declaration

当我向前宣布课程时,我有一个类似的定义:

#define API __declspec(dllexport)

我应该用它声明函数,还是没有它?我知道我需要在完全宣布课程时(比如,有身体和东西),但我想知道我是否应该在前向声明中使用它。

1 个答案:

答案 0 :(得分:0)

一般来说,我的回答是“不”。

__declspec(dllexport)__declspec(dllimport)属性只需知道“我们需要导出此内容”和“我们需要导入此内容”这一事实。 在只有前向声明就足够的地方,这个事实并不重要,因为这意味着在这个地方足以知道这样的类存在。

最常见的用例之一是这样的:

// --- Library ---
// Library.h
class LIBRARY_API LibraryClass
{
     void SomeMethod();
}

// Library.cpp
#include "Library.h" // we include the declaration together with __declspec(dllimport)
void LibraryClass::SomeMethod() { /*do something*/ }


// --- Some module which uses Library ---
// Some class .h file
class LibraryClass; // forward declaration
class SomeClass
{
    std::unique_ptr<LibraryClass> mp_lib_class; 
    // forward decl of LibraryClass is enough 
    // - compiler does not need to know anything about this class

    // ...   
}

// Some class .cpp file
#include <Library/Library.h> 
// here we include LibraryClass declaration with __declspec(dllimport)

//...
SomeClass::SomeClass()
    : mp_lib_class(std::make_unique<LibraryClass>())
        // here we need to actually call LibraryClass code
        // - and we know that it's imported because of #include
{}

如果你正在向库中声明LibraryClass实际定义的内容,那么__declspec(dllexport)不会改变任何东西,因为无论这些前向声明都会导出类。