【问题标题】:How to make a string preprocessor definition from command-line in VC 2005 (C++)?如何在 VC 2005 (C++) 中从命令行定义字符串预处理器?
【发布时间】:2010-11-21 06:47:40
【问题描述】:

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

  CL /DDEBUG TEST.C

将定义一个 DEBUG 符号,并且

  CL /DDEBUG=2 TEST.C

会给它值 2。 但是如果我想得到一个字符串定义的等价物,我该怎么办,例如

  #define DEBUG "abc"

?

【问题讨论】:

    标签: c++ visual-c++ command-line c-preprocessor


    【解决方案1】:

    这在 VS2013 中适用于我:

    /D_STRING="\"abc\""
    

    那么就等价于

    #define _STRING "abc"
    

    注意,如果你这样做了

    /D_STRING="abc"
    

    相当于

    #define _STRING abc
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不幸的是,至少在 MSVC2012 下,您不能在命令行上传递带有参数的预处理器定义:(
      【解决方案3】:

      感谢 Glen,第二个可以在命令行上工作,但我要求这个的同事最终在项目定义中使用了这个(需要转义双引号并将 = 替换为 #):

      /DDEBUG#\"abc\"
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          你试过了吗

          CL /DDEBUG=abc TEST.C
          

          CL /DDEBUG="abc" TEST.C
          

          【讨论】:

            猜你喜欢
            • 2023-03-24
            • 2011-10-23
            • 1970-01-01
            • 2010-10-03
            • 2021-12-29
            • 2022-01-01
            • 1970-01-01
            • 2012-02-16
            相关资源
            最近更新 更多