对于 RC 文件预处理器指令非常有限,请参阅:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa381033 (v=vs.85).aspx
指令描述
#define 通过为其分配给定值来定义指定名称。
#elif 标记条件编译块的可选子句。
#else 标记条件编译块的最后一个可选子句。
#endif 标记条件编译块的结束。
#if 如果指定表达式为真,则有条件地编译脚本。
#ifdef 如果定义了指定的名称,则有条件地编译脚本。
#ifndef 如果未定义指定名称,则有条件地编译脚本。
#include 将文件的内容复制到资源定义文件中。
#undef 删除指定名称的定义。
并且#define
是简单的形式:(在http://msdn.microsoft.com/en-us/library/windows/desktop/aa381061(v=vs.85).aspx之后):
#定义名称值
有解决方案 - 根据这个答案准备您的 ICON/BITMAPS 路径作为环境变量,您可以从客户名称构建它们 - 但必须在您的批处理文件或生成文件中完成:
从已经提到的答案:
In your project properties add ;$(CMDLINE_DEFINES) to the end of your resource preprocessor definitions. (Be sure to pick the right configuration.)
Then when you use MSBuild from the command line type (or add to a batch file)...
C:\Projects\SomeProject> set CMDLINE_DEFINES=SOMETEST=42
C:\Projects\SomeProject> MSBuild SomeProject.vcproj
此答案适用于 C++ 文件:
对于您的示例:
CONCAT("../files/images/",CUSTOMER_ID,"icon.ico")
你应该使用这样的宏:
#define TOSTRING(T) #T
#define CONCAT(dir, cid, filetype) dir TOSTRING(cid) filetype
这是因为这个宏展开是:"../files/images/" "customer1" "icon.ico"
. C++ 编译器将连接相邻的字符串文字。
这个例子:
#include <iostream>
#define TOSTRING(T) #T
#define CONCAT(dir, cid, filetype) dir TOSTRING(cid) filetype
#define CUSTOMER_ID customer1
int main() {
std::cout << ">>>>>" << CONCAT("../files/images/",CUSTOMER_ID,"icon.ico") << "<<<<\n";
}
将产生输出:
>>>>>../files/images/customer1icon.ico<<<<
可能您应该在.../
之前添加icon.ico