Альтернативы для пустых макросов - PullRequest
2 голосов
/ 18 декабря 2010

В моем заголовочном файле C ++ у меня есть следующее:

#ifdef _DLL
#define DLL_API __declspec(dllexport) // Being compiled as a DLL.
#else
#define DLL_API // Not being compiled as a DLL.
#endif

Позже у меня есть такие вещи:

DLL_API int GetNumber();

Я упрощаю, но основной вопрос здесьесть ли способ заставить компилятор просто пропустить DLL_API, если он не определен.

Ответы [ 2 ]

4 голосов
/ 18 декабря 2010

Нет.

Когда DLL_API определен как макрос препроцессора, который не содержит ничего, тогда препроцессор заменяет DLL_API ничем, и компилятор там ничего не увидит.Если он не определен для препроцессора, то препроцессор ничего не делает с ним.Тогда компилятор увидит это без изменений, и вы получите ошибку компилятора о неизвестном идентификаторе DLL_API, потому что такая вещь не является частью языка C ++.

Атрибуты, такие как __declspec (), являются расширениями, специфичными для платформы, и принято заключать в них использованиев интерфейсах в макросах препроцессора.

1 голос
/ 18 декабря 2010

Обычно это

#ifdef _WIN32
#ifdef _DLL
#define DLL_API __declspec(dllexport) // Being compiled as a DLL.
#else
#define DLL_API __declspec(dllimport) // Not being compiled as a DLL.
#endif
#else
#define DLL_API
#endif

, поэтому он переносим, ​​и DLL_API всегда преобразуется в нечто допустимое.

...