Как я могу использовать макрос препроцессора в директиве #import? - PullRequest
0 голосов
/ 04 марта 2019

Основной проект нашей компании имеет несколько констант препроцессора, которые должны быть настроены для разных клиентов.Когда программа была впервые написана, ее считали достаточной для простого создания версий кода для отладки и выпуска.Никому и в голову не приходило, пока я не устал все время перестраивать проект, когда мы могли использовать константы препроцессора и настройки проекта для создания разных папок для каждого клиента.

Но у нас есть одна библиотека ActiveX DLL, в которой наш проект нуждаетсядолжен быть в определенной папке.(Создание ActiveX DLL было еще одним из длинного списка плохих решений, которые моя компания приняла в этом проекте.) Эта DLL импортируется в код следующим образом:

#ifdef _DEBUG
    #import "..\Debug\CapsHelper.dll" no_namespace
#else
    #import "..\Release\CapsHelper.dll" no_namespace
#endif

Я сейчас пытаюсь создатьдля клиента по имени Алгома.Итак, я хочу создать константу препроцессора с именем CUSTOMER, которая будет содержать «Alcoma», а затем указать компилятору импортировать из папки с именем «Debug Alcoma» или «Release Alcoma».Как мне это сделать?

Я попробовал это:

#define CUSTOMER Alcoma
#ifdef _DEBUG
#import "..\Debug " #CUSTOMER "\CapsHelper.dll" no_namespace
#else
    #import "..\Release " #CUSTOMER "\CapsHelper.dll" no_namespace
#endif

Но это не сработало.Он также не работал без # перед ЗАКАЗЧИКОМ.

1 Ответ

0 голосов
/ 05 марта 2019

Я предполагаю, что вы используете MSVC, и я не тестировал это решение с ним.Но это должно работать:

#define XSTR(X) #X
#define STR(X)  XSTR(X)

#ifdef _DEBUG
#import STR(..\Debug CUSTOMER\CapsHelper.dll) no_namespace
#else
#import STR(..\Release CUSTOMER\CapsHelper.dll) no_namespace
#endif

Основная проблема с вашей попыткой (кроме факта в стандартном C / C ++, # может происходить только внутри макроподключения) заключается в том, что #include (иПолагаю, что #import) будет макроправдить свой аргумент, не будет выполнять конкатенацию строк.Поэтому оператор stringify должен применяться ко всей строке.

...