Я пишу DLL, которая будет экспортировать функции и классы. Но сейчас у меня есть вопрос об экспорте функций.
Если моя подпись функции выглядит так:
__declspec(dllexport) int fn1(FILE *theFile);
Должен ли я включить, чтобы он определял ФАЙЛ? Какова лучшая практика здесь?
И если я хочу экспортировать функцию, которая принимает или возвращает пользовательский тип, должен ли файл заголовка для этих типов быть включен в экспортируемый файл заголовка?
Не пересылайте стандартные типы и функции библиотеки. Для этого предусмотрены заголовки библиотеки. Ваш файл должен быть выложен как:
#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
Заголовки для некоторых типов, которые вы используете. Например, вы можете вместо этого использовать предварительные объявления.