Странность препроцессора Visual Studio 2008

Мы настроили простую систему управления версиями для наших сборок, чтобы встроенные файлы всегда указывали, являются ли они сборками Beta Debug или Beta Release.

Я переместил информацию о версии файла в myapp.rc2 и создал version.h

    // version.h 
    // _DEBUG is defined by VS

    #define _BETA

    #ifdef _BETA
    #define FILE_DESC1   _T("BETA ")
    #else
    #define FILE_DESC1  // blank on purpose 
    #endif

    #ifdef _DEBUG
    #define FILE_DESC2   _T("Debug Version ")
    #else
    #define FILE_DESC2   _T("Release Version ") // this is greyed out in the ide when building
    #endif

    #define FILE_DESC   FILE_DESC1 FILE_DESC2


// myapp.rc2
include "version.h"

#ifndef _T
#define _T(x)   x
#endif

VS_VERSION_INFO VERSIONINFO
 FILEVERSION PROD_VER_MJR,PROD_VER_MIN,PROD_VER_UPD,JOBUILDER_BUILD
 PRODUCTVERSION PROD_VER_MJR,PROD_VER_MIN
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904e4"
        BEGIN
            VALUE "CompanyName", COMPANY_NAME
            VALUE "FileDescription", FILE_DESC
            VALUE "FileVersion", JOBBUI_VERSION
            VALUE "InternalName", "MyApp.exe" 
            VALUE "LegalCopyright", COPYRIGHT
            VALUE "OriginalFilename", "MyApp.exe"
            VALUE "ProductName", PRODUCT_NAME
            VALUE "ProductVersion", PRODUCT_VERSION
            VALUE "Comments",  COMMENTS
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END

Однако, когда исполняемый файл встроен в выходной каталог отладки, описание файла всегда неправильно говорит «БЕТА-версия выпуска» вместо «БЕТА-версия отладки». Тем не менее, IDE указывает, что будет использоваться «#define FILE_DESC2 _T (« Отладочная версия »)». Почему это могло быть? Я использовал эти файлы в другом проекте, и они работают правильно.

Спасибо...


person Canacourse    schedule 15.11.2009    source источник


Ответы (2)


Исправлено: в отладочной сборке я добавил _DEBUG в: -

Свойства проекта> Ресурсы> Определения препроцессора. И теперь он работает, как ожидалось.

person Canacourse    schedule 16.11.2009

Лучший способ «отладить» подобные проблемы препроцессора - это вставить директиву #error в тот момент, когда, по вашему мнению, ваш макрос на самом деле получает #define'd

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

Изменить: кроме того, запуск препроцессора для компилятора ресурсов может отличаться от запуска для компилятора в отношении того, какие макросы предопределены.

person rep_movsd    schedule 15.11.2009
comment
Вы редактируете: Правильно. Я добавил директиву #error, как вы предложили, а затем получил эту фатальную ошибку RC1116: RC завершение после ошибок препроцессора Похоже, что у компилятора ресурсов возникла проблема с #error (возможно, не известна / не поддерживается) и моими исходными #defines. Интересно, как обойти это? код sam, похоже, работает над другим проектом VS2008. - person Canacourse; 15.11.2009