我正在编写一个将导出函数和类的 dll。但现在我有一个关于导出函数的问题。
如果我的函数签名如下所示:
__declspec(dllexport) int fn1(FILE *theFile);
我应该包括它以定义文件吗?这里的最佳做法是什么?如果我想导出一个接受或返回自定义类型的函数,这些类型的头文件是否也应该包含在导出的头文件中?
不要前向 decl 标准库类型和函数。这就是提供库头文件的目的。您的文件应布局为:
#ifndef MYLIBRARY_H
#define MYLIBRARY_H
#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_EXPORT __declspec(dllexport)
#else
#define MYLIBRARY_EXPORT __declspec(dllimport)
#endif
// required headers
#include <stdio.h>
// exported/imported functions
MYLIBRARY_EXPORT int fn1(FILE *theFile);
#endif
您的 DLL 项目是使用MYLIBRARY_EXPORTS
定义为部分或定义的预处理器宏(可配置任意数量的方式)构建的,并且您的 DLL 的使用者不定义它。
这是 MS 用于其向导罐头 DLL 项目生成器的常见布局。考虑在您的项目中也这样做。最重要的是,为您的库包含所需的标准头文件,以正确定义它需要输入的内容以及输出的内容。
头文件通常应该是自包含的。使用您的头文件的客户端在包含您自己的头文件之前不必知道他们需要一些#include "xyz.h"
行。(想象一下,如果另一个xyz.h
头文件做同样的事情,等等。你需要知道所有头文件的严格顺序,这将是一场噩梦。)
但是,您不一定需要为#include
您使用的某些类型添加标题。例如,您也许可以改用前向声明。