如何有条件地编译VC6资源

时间:2009-03-12 09:43:34

标签: mfc resources vc6 conditional-compilation

取决于编译开关(值为COMPILE_ACOMPILE_B),这是以envorinment变量的形式设置的,我想用不同的设置编译我的应用程序,比如应用程序名称和启动屏幕。

我到目前为止:

  1. 在“项目/设置/ C / C ++ /预处理器定义”中,我添加了$(COMPILESWITCH)(生成命令行选项/D "$(COMPILESWITCH)")。

  2. 在stdafx.h中我可以使用以下代码,这意味着我通过命令行参数正确定义了预处理器定义:

  3. 
        #if defined COMPILE_A
        #   define IDB_SPLASH IDB_SPLASH_A
        # elif defined COMPILE_B
        #   define IDB_SPLASH IDB_SPLASH_B
        # else
        #   error Unknown or undefined target compile switch; cannot compile!
        # endif
    

    但是我注意到“ResourceView / [右键单击] /属性”下的“条件”属性... 帮助文本说明了这一点:

      条件      

    确定包含   资源。例如,如果   条件是_DEBUG,这个资源   将仅包含在调试中   生成。

    这看起来很优雅,对吧?

    在条件有效的情况下指定_DEBUG。因此_DEBUG通过/D _DEBUG指定,$(COMPILESWITCH)也应该有效,对吧? 出于某种原因,它没有;为什么呢?

    或者是否还有另一种更好的方式来实现我想要的目标?

1 个答案:

答案 0 :(得分:2)

我想我刚刚解决了我的问题...

资源编译器使用自己的预处理器 因此,必须在“项目/设置/资源/预处理器定义”下添加相同的预处理器定义。

编辑:字符串资源

上述内容不适用于字符串资源,因为它们没有“条件”属性...

我选择使用资源编辑器不会触及的res\<projectname>.rc2自定义资源文件。 内容看起来像这样

#if defined(COMPILE_A)
    STRINGTABLE DISCARDABLE 
    BEGIN
        IDR_MAINFRAME           "AppTitle A"
    END
#else
#   if defined(COMPILE_B)
    STRINGTABLE DISCARDABLE 
    BEGIN
        IDR_MAINFRAME           "AppTitle B"
    END
#   else
#       error Compile switch not defined or unknown; cannot compile!
#   endif
#endif