MSVC:如何在从命令行传递的预处理器宏的值中包含#字符

MSVC: how to include the # character in the value of a pre-processor macro passed from the command-line

我们 build/run 我们在 MSVC 上的嵌入式 C 代码作为一个方便的 development/test 环境。

像大多数 C 编译器一样,MSVC 允许使用 -D 在命令行上定义预处理器宏,即 CL -DTHING=somechars somefile.c 将导致 somefile.c 看到 #define THING somechars.我们的问题是我们需要传入一个预处理器宏,其中值包含 # 字符(它用于我们正在测试嵌入式 C 代码的密码,因此必须内置到嵌入式测试代码,我们坚持使用它),即我们想做 CL -DTHING=1234# somefile.c 以便 somefile.c 看到 #define THING 1234#.

然而 MSVC uses # as a substitute for =,所以 somefile.c 最终看到的是 #define THING 1234=;我们的密码现在是错误的。

有谁知道是否有办法阻止 MSVC 这样做!?

我试过用 ## 代替 # 来转义值,但结果是 =#,这也好不了多少;我想 MSVC 意识到不能有两个 = 符号,但我的字符串仍然是错误的,而且我无法在嵌入式 C 代码中做任何明智的事情来恢复这种情况,因为这需要一个 const

在通过命令行定义预处理符号时,只需使用 # 而不是 = 将预处理符号与其值分开。例如,这个

CL /D THING#1234# somefile.c

将转换为:

#define THING 1234#

或者,如果 THING 宏必须扩展为正确的(带引号的)字符串文字,请使用以下格式(请注意,引号必须在命令行中使用 \ 进行转义,以防止被吞噬):

CL /D THING#\"1234#\" somefile.c

这将转换为:

#define THING "1234#"