C++ 如何在VC 2005(C+;+;)中从命令行定义字符串预处理器?

C++ 如何在VC 2005(C+;+;)中从命令行定义字符串预处理器?,c++,visual-c++,command-line,c-preprocessor,C++,Visual C++,Command Line,C Preprocessor,告诉我可以使用/D命令行开关来执行此操作,如下所示: CL /DDEBUG TEST.C 将定义调试符号,并且 CL /DDEBUG=2 TEST.C 将其值设为2。 但是如果我想得到字符串定义的等价物,比如 #define DEBUG "abc" 你试过了吗 CL /DDEBUG=abc TEST.C 或 我没有VC来为您测试这一点,但是,原则上,以下应该可以工作: CL /DSTRINGIFY(X)=#X /DDEBUG=STRINGIFY(abc) TEST.C 更新

告诉我可以使用/D命令行开关来执行此操作,如下所示:

  CL /DDEBUG TEST.C
将定义调试符号,并且

  CL /DDEBUG=2 TEST.C
将其值设为2。 但是如果我想得到字符串定义的等价物,比如

  #define DEBUG "abc"
你试过了吗

CL /DDEBUG=abc TEST.C


我没有VC来为您测试这一点,但是,原则上,以下应该可以工作:

CL /DSTRINGIFY(X)=#X /DDEBUG=STRINGIFY(abc) TEST.C
更新:

正如库伯·奥伯(Kuber Ober)所强调的,VC在这方面似乎做得不对。通过一个简单的示例进行测试,它生成:

const char * s = STRINGIFY(abc);
它可以与其他编译器一起工作,例如,以下g++命令行可以工作:

g++ -D'STRINGIFY(X)=#X' -D'DEBUG=STRINGIFY(abc)' t.cc -E

# 1 "t.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "t.cc"

const char * s = "abc";
g++-D'STRINGIFY(X)=#X'-D'DEBUG=STRINGIFY(abc)'t.cc-E
#1“t.cc”
# 1 ""
# 1 ""
#1“t.cc”
const char*s=“abc”;

由于Windows中解析命令行的方式,您必须转义引号

CL /DDEBUG=\"abc\" TEST.C

谢谢Glen,第二个可以在命令行上运行,但是我请求的同事最终在项目定义中使用了它(需要避开双引号并用#替换=):


这在VS2013中适用于我:

/D_STRING="\"abc\""
那么它就相当于

#define _STRING "abc"
注意,如果你这样做了

/D_STRING="abc"
这相当于

#define _STRING abc

不幸的是,至少在MSVC2012下,您无法在命令行上传递带参数的预处理器定义:(
/D_STRING="abc"
#define _STRING abc