【问题标题】:Why does this macro evaluating wrong?为什么这个宏评估错误?
【发布时间】:2015-03-18 13:52:07
【问题描述】:

我创建了一个应用程序,我必须为它创建两个单独的构建。一个用于 32 位,一个用于 64 位。在文件的属性中,我想包含一些描述,例如原始文件名,我想在其中设置架构(x64 或 x86)。看起来它比我想象的要难,或者我做错了什么。

#ifdef _WIN64
   #define ARCHIT "1"
#else
   #define ARCHIT "2"
#endif

这个宏总是返回 2。我做错了什么吗?如果我在我看到的define 之前插入一些#pragma message,那就是正确评估,但不知何故,文件属性中写入的文本将始终为 2。

有人可以帮我吗?

谢谢!

更新:

这就是我使用它的方式:

#define VER_FILEVERSION             1,0,0,0
#define VER_FILEVERSION_STR         "1.0.0.0\0"

#define VER_PRODUCTVERSION          1,0,0,0
#define VER_PRODUCTVERSION_STR      "1.0.0.0\0"


1 VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
    BLOCK "040904b0"
    BEGIN
        VALUE "FileDescription", "My Description"
        VALUE "FileVersion", VER_FILEVERSION_STR
        VALUE "InternalName", BASENAME
        VALUE "LegalCopyright", "My company"
        VALUE "OriginalFilename", ARCHIT
        VALUE "ProductName", BASENAME
        VALUE "ProductVersion", VER_PRODUCTVERSION_STR
    END
END
BLOCK "VarFileInfo"
BEGIN
    VALUE "Translation", 0x409, 1200
END
END

【问题讨论】:

  • 宏不会“返回”任何东西。展示你是如何使用它的,最好是两行的main()来展示你的观察。
  • @WhozCraig。我更新了我的问题。我就是这样用的。
  • 开始、阻塞、结束、值?为什么这被标记为 C?
  • 感谢您的更新。除非我弄错了 C/C++ compiler_WIN64 notresource 编译器 (RC) 建立,否则很可能是你的问题。
  • 您可以通过编辑项目设置来伪造它,前往每个平台目标的资源/常规/预处理器并设置您自己的宏。请务必为 both 目标平台进行调试和发布。但是,请检查 RC 文档以查看是否有任何 他们 事先定义为 dicern x64 vs x86。可以为您节省一些时间。

标签: visual-studio macros preprocessor rc


【解决方案1】:

从 cmets 和 MSDN 看来,RC 脚本中唯一预定义的宏是 RC_INVOKED。所以,你不能自动化 RC 脚本。但是有T4 text templates,以及他们的.tt 脚本。使用它们,您可以创建某种 .rc2 脚本,它可以 #define 满足您的任何需求,然后您可以在 .rc 脚本中使用 #include

理论上应该可行,但从未尝试过。

有一个page 解释了如何使用 T4 脚本自动生成代码,根据该页面,您需要为您的 Visual Studio 安装一个建模 SDK(201020122013)。很遗憾,它不适用于旧版本。

【讨论】:

  • 如果您在设计时使用 T4,则无需安装任何东西。有关构建期间的更新,另请参阅this question
【解决方案2】:

谢谢大家,但对我来说,这是Solution。我认为这是最简单的。

更新:

详细说明,以防链接失效:

1. Open your project in Visual Studio.
2. Right click on resource script file (e.g. app.rc) and select "Properties"
3. At the top of the property page, select one platform like "Win32" or 
"x64".
4. In the left menu bar, select [Configuration Properties] / [Resources] / 
[General].
5. In the "Preprocessor Definitions" field, add "WIN32" for "Win32" 
platform and "WIN64" for "x64" platform. The field value will become " 
WINXX;_UNICODE;UNICODE". (XX will be 32 or 64)
6. Click OK to close the window.
7. Right click on resource script file (e.g. app.rc) and select "View Code".
8. In the code editor, add #ifdef and #elif to conditionally include 
resources when compiling.

【讨论】:

  • 我没有添加谢谢作为答案。我提供了一个链接,可以在其中找到解决方案。我应该投票赞成什么?没有一个答案对我有用,只有我发布的那个。感谢人们的努力是不好的?还是我应该投票支持所有内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2020-04-03
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多