当我向前宣布课程时,我有一个类似的定义:
#define API __declspec(dllexport)
我应该用它声明函数,还是没有它?我知道我需要在完全宣布课程时(比如,有身体和东西),但我想知道我是否应该在前向声明中使用它。
答案 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)
不会改变任何东西,因为无论这些前向声明都会导出类。