假设您在遗留的Visual C++2010项目中有一个标签,定义如下:
[foo.rc]
LTEXT "Foo",IDC_STATIC,42,42,42,42
在资源(.rc)文件中。
现在,您需要根据头文件中定义的常量生成文本,如下所示:
[foo.rc]
LTEXT FOO_TEXT,IDC_STATIC,42,42,42,42
其中FOO_TEXT以前以其他方式定义,例如:
[bar.h]
#define FROBNICATE "F"
#define OO "o"
#define ICANTTHINKOFMETASYNTACTICVARIABLESBEGINNINGWITHO "o"
#define FOO_TEXT (FROBNICATE OO ICANTTHINKOFMETASYNTACTICVARIABLESBEGINNINGWITHO)
只是这不起作用,因为.rc文件不是头文件,rc编译器会抱怨,告诉你:
[Build output]
1>foo.rc(42): error RC2116: expecting number for ID
1>
1>
1>foo.rc(42): error RC2108: expected numerical dialog constant
你会怎么做?
为了澄清,是的,整个有问题的字符串在编译时是已知的,但它也需要由较小的字符串构建(在这种情况下,是版本信息和发布类别(开发、发布和另一个))。当然,我也可以编写这样的C++代码,但这对我来说似乎很不雅
那么,有更好的方法吗?
我认为如果没有C++代码,你将无法实现你想要的。请参阅这篇msdn文章的评论:
不要在#define中使用parens资源编译器对指令的理解非常有限。例如:
#define RESTYPE_FILE (256)
将被忽略,而这个:
#define RESTYPE_FILE 256
将起作用。显然,尝试使用表达式或类似的任何复杂的东西都会默默地失败,让您想知道为什么不能加载该资源。