【问题标题】:How to define a pattern in macro in C++?如何在 C++ 中的宏中定义模式?
【发布时间】:2013-06-17 15:22:08
【问题描述】:

我的文件有太多像

这样的部分
 [Section]

 [Section.Ia32]

 [Section.x64].... so more

所以,我需要定义一个宏,以便在解析文件时我们可以使用一个宏来获取该部分。目前我正在尝试,

#define APattern = "(^(\\s)*\\[Section(\\.\\w+)*\\])"; 

它编译成功了……但它不工作。

例如

  CString a = Section;
  a.compareNoCase(APattern);

它不工作..

谢谢

【问题讨论】:

  • #define APatter "(^(\\s)*\\[Section(\\.\\w+)*\\])"(没有=;)将是一个起点。我不确定这是否真的对你有帮助,因为我不完全确定你真正想要达到的目标。
  • 我建议改为const CString APattern = "..."。此处的宏完全没有理由。

标签: c++ visual-c++ mfc


【解决方案1】:

我认为您定义中的语法不正确。在 c++ 中 定义 没有

    "=", 

比较喜欢

    #define SQR(a) (a * a). 

所以在你的定义中也缺少一个参数。不要使用

     ";" 

在行尾。 其次,您将结果作为参数传递给函数

    a.compareNoCase(), 

您定义返回的类型的含义可能不正确。

【讨论】:

    【解决方案2】:

    使用#define 粘贴名称后的所有内容。所以对于你的例子,结果将是:

    CString a = Section;
    a.compareNoCase( = "(^(\\s)*\\[Section(\\.\\w+)*\\])"; );
    

    您自己可以看到它是无效的语法。对于正确的定义,您可以倒退:

    a.compareNoCase( "(^(\\s)*\\[Section(\\.\\w+)*\\])" );
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    -->
    #define APattern "(^(\\s)*\\[Section(\\.\\w+)*\\])"
    

    【讨论】:

      【解决方案3】:

      我认为您有 2 个问题,第一个问题是关于 C 宏语法,由 fiscblog 答案 (+1) 正确解决,另一个是您似乎实际上期望 正则表达式 匹配,这就是 CString 的能力。参见 this answer 以获取在 Visual C++ 中工作的正则表达式匹配

      说实话,我会使用 sscanf 来解决这个问题,或多或少像

      #define ASection(In, Section) (sscanf(In, " [Section(%^[)])", Section) == 1)
      

      【讨论】:

        猜你喜欢
        • 2018-11-12
        • 2014-01-09
        • 2019-12-23
        • 2012-09-05
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        相关资源
        最近更新 更多