我正在编写一个将导出函数和类的DLL。但是现在我对导出函数有疑问。
如果我的功能签名如下:
__declspec(dllexport) int fn1(FILE *theFile);
我应该包括所以定义FILE吗?这里的最佳做法是什么? 如果我想导出一个接受或返回自定义类型的函数,那么这些类型的头文件是否也应包含在导出的头文件中?
答案 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
标头。例如,您可能可以使用前向声明。