2015-03-02 2 views
1

Я попытался использовать библиотеку на визуальной студии по-разному, изменив ее макросы в директивах препроцессора. Однако логический блок внутри директивы #if показан мне неактивным, поскольку это был комментарий. Вот код:Препроцессор логического блока Win32 неактивен

#if defined EBML_DLL 
    #if defined EBML_DLL_EXPORT 
     #define EBML_DLL_API __declspec(dllexport) 
    #else // EBML_DLL_EXPORT 
     #define EBML_DLL_API __declspec(dllimport) 
    #endif // EBML_DLL_EXPORT 
    #else // EBML_DLL 
    #define EBML_DLL_API 
    #endif // EBML_DLL 

проблемы является то, что Visual Studio показывает код внутри если ebml_dll блок неактивен (как комментировал). В результате DLL не отображает функции в обозревателе объектов VS.

Подсказка: если в конце #if в конце строки EBML_DLL добавлена ​​обратная косая черта, она активирует только блок else.

+0

Что именно ваш вопрос? Будет активна только часть, которая оценивает значение true. – user0815

ответ

1

В этом была ошибка в старых версиях VS, но это была всего лишь проблема с отображением. VS не правильно читал определения (в вашем случае EBML_DLL и т. Д.).

Это может быть также, что константы вы используете в операторах препроцессора не являются правильными и отсутствуют символы (обычно те, что использует компилятор имеет подчеркивание в начале и в конце)

Чтобы действительно знать наверняка какой он есть, вы можете добавить случайную строку внутри ветви, которую должен взять препроцессор, и посмотреть, компилируется ли код.

#if defined EBML_DLL 
this_should_not_compile //you should get an error on this line 
#endif 

Надеется, что это помогает ...

+0

спасибо за повтор. По словам вашего собеседника, причиной является то, что препроцессор не распознает элемент в блоке if else. thats razonable, потому что EBML_DLL_EXPORT, EBML_DLL и т. д. все определяют с помощью опции -D для компилятора. –

+0

Нет, препроцессор или часть отображения VS, имеет проблему, определяющую, определены ли константы, используемые в директивах препроцессора. Если вы говорите, что передаете их с помощью опции -D в вашей инструментальной цепочке, то VS не сможет узнать о них до момента компиляции. Я думаю, что это было исправлено в одном из новых выпусков VS. – Pandrei

+0

спасибо за повтор. Я проверяю ваш код, похоже, на ошибку отображения. Он создает библиотеку, однако он не показывает функции, добавленные в браузер objetc. и это приведет к ошибке funtion, если я попытаюсь использовать эту функцию. Однако теперь ошибка кажется nat проблемой препроцессора. Еще раз спасибо –

Смежные вопросы