如何通过Visual Studio中的预处理器传递包含字符串和引号的环境变量

How to pass an environment variable containing a string and quotation marks through the preprocessor in Visual Studio?

本文关键字:字符串 包含 环境变量 处理器 Visual 何通过 Studio 预处理      更新时间:2023-10-16

首先是整个故事:

我正在重构一些包含以下几行的遗留代码:

#pragma comment(lib, "D:\Some\absolute\path\to\some\library.lib")

由于我不能在这里解释的原因,我需要在这里有相对的路径。如果有这样的,那就太好了

#pragma comment(lib, "to\some\library.lib")

把"D:\Some\absolute\path\"放在库目录的属性中会起作用,但没有,我确实理解为什么。

我目前的方法是(i)将D:\Some\absolute\path定义为用户宏Some_absolute_path,然后(ii)将Some_AABSolute_path#$(Some_absolute_path)添加到预处理器定义中,从而生成编译器调用

cl ... /D "SOME_ABSOLUTE_PATH#D:Someabsolutepath"

然后我在类似的代码中使用这个定义

#pragma comment(lib, SOME_ABSOLUTE_PATH ## "to\some\library.lib")

这不起作用。看看预处理器的输出,它被扩展到这个

#pragma comment(lib, D:Someabsolutepath ## "to\some\library.lib")

这当然是因为我在某些地方没有正确地通过引号。在用户宏(i)中添加引号没有帮助,因为这会导致

cl ... /D "SOME_ABSOLUTE_PATH#"D:Someabsolutepath""

命令行解释器无法正确解析。

你是怎么做到的?我也对任何其他满足约束的解决方案持开放态度,即我可以在pragma指令中有一些相对路径。

#define STRINGISE2(X) #X
#define STRINGISE(X) STRINGISE2(X)
#pragma comment(lib, STRINGISE(SOME_ABSOLUTE_PATH) "to\some\library.lib")