如何在C ++中用宏定义模式?

时间:2013-06-17 06:53:18

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

我的文件太多,如

 [Section]

 [Section.Ia32]

 [Section.x64].... so more

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

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

它已成功编译......但它无法正常工作。

例如

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

它不起作用..

谢谢

3 个答案:

答案 0 :(得分:1)

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

    "=", 

非常喜欢

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

所以在你的定义中,一个参数也缺失了。 <不要使用

     ";" 

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

    a.compareNoCase(), 

在您的定义返回哪种类型的意义上可能不正确。

答案 1 :(得分:1)

我认为你有2个问题,第一个问题,关于C宏语法,正确地通过fiscblog回答(+1)解决,另一个问题似乎是你实际上期待正则表达式匹配,这超过了CString的能力。例如,参见this answer以获得在Visual C ++中匹配的正则表达式

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

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

答案 2 :(得分:1)

使用#define粘贴名称后的所有内容。因此,对于您的示例,结果将是:

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

你可以亲眼看到它是无效的语法。为了正确定义,你可以倒退:

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