Win32 DLL导出函数参数最佳实践

时间:2013-04-16 15:24:34

标签: c++ winapi dllexport

我正在编写一个将导出函数和类的DLL。但是现在我对导出函数有疑问。

如果我的功能签名如下:

__declspec(dllexport) int fn1(FILE *theFile);

我应该包括所以定义FILE吗?这里的最佳做法是什么? 如果我想导出一个接受或返回自定义类型的函数,那么这些类型的头文件是否也应包含在导出的头文件中?

2 个答案:

答案 0 :(得分:5)

不要转发标准库类型和功能。这就是提供库头的内容。您的文件应该布置为:

#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项目生成器的通用布局。考虑在您的项目中也这样做。最重要的是,包括库所需的标准标题,以正确定义它所需要的内容以及它提供的内容。

答案 1 :(得分:2)

头文件通常应该是自包含的。使用您的头文件的客户端在包含您自己的标头之前不必知道他们需要一些#include "xyz.h"行。 (想象一下,如果其他xyz.h标题做同样的事情,依此类推。你需要知道对所有头文件的严格排序,这将是一场噩梦。)

但是,对于您使用的某些类型,您不一定需要#include标头。例如,您可能可以使用前向声明。