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#"
我们 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#"