代码之家  ›  专栏  ›  技术社区  ›  MaxVT

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

  •  2
  • MaxVT  · 技术社区  · 15 年前

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

      CL /DDEBUG TEST.C
    

    将定义调试符号,并且

      CL /DDEBUG=2 TEST.C
    

    但是如果我想得到字符串定义的等价物,比如

      #define DEBUG "abc"
    

    ?

    5 回复  |  直到 8 年前
        1
  •  7
  •   avakar    15 年前

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

    CL /DDEBUG=\"abc\" TEST.C
    
        2
  •  3
  •   Chaohsiung Huang    6 年前

    这在VS2013中适用于我:

    /D_STRING="\"abc\""
    

    那么它就相当于

    #define _STRING "abc"
    

    /D_STRING="abc"
    

    这相当于

    #define _STRING abc
    
        3
  •  2
  •   Glen    15 年前

    你试过了吗

    CL /DDEBUG=abc TEST.C
    

    CL /DDEBUG="abc" TEST.C
    
        4
  •  2
  •   MaxVT    15 年前

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

    /DDEBUG#\"abc\"
    
        5
  •  -1
  •   Richard Corden    10 年前

    我没有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";