匹配两个字符串的宏定义

时间:2016-01-19 13:22:28

标签: c++ macros arguments c-preprocessor matching

我想用C ++在C ++中定义一个表达式,我遇到了很多麻烦。

  • 表达式为:

    MATCH 字符串 WITH other_string

其中string和other_string不需要“”

例如: MATCH r1 WITH string1 是我想要的结果。

此宏的目的是检查r1字符串是否与r2匹配。

(我已经有了匹配的代码)

  • 更新

我想打电话给 MATCH你好

在我的主要功能

int main(){ 

    MATCH hello WITH hi

}

并从此宏调用我的函数来比较它们。 ** hello和hi都是不带引号的参数,必须被视为变量名

2 个答案:

答案 0 :(得分:0)

只需使用#字符串化您的参数,例如:

#define MATCH_WITH(str1, str2) MATCH #str1 WITH #str2

那样:

MATCH_WITH(testing, testing)

变为:

MATCH "testing" WITH "testing"

答案 1 :(得分:0)

使用宏来使代码看起来像一种不同的语言总是不确定的。最好考虑为你的元语言使用单独的解析器"为您生成C ++代码。

在这种情况下,由于C ++语法需要某种方式来指示语句的结尾(关闭括号或分号),所以你会遇到麻烦。

考虑你的例子:

int main () { MATCH hello WITH hi }

由于himain结尾之前的最后一个标记,因此没有机会修复语法以符合C ++要求。

你不能做你想做的事情,所以你必须做一些不同的事情

如果您真的打算将此语法嵌入到C ++代码中,则需要使用标记令牌来修复语法。我提出的语法是:

int main () {
BEGIN_MATCHING
MATCH hello WITH hi
MATCH hello WITH hi
END_MATCHING
};

如果此语法可以接受,则可以使用以下宏。

#define BEGIN_MATCHING ((void)0
#define MATCH ); my_function(
#define WITH ,
#define END_MATCHING );

这将使建议的语法示例中的代码扩展为:

int main () {
((void)0
); my_function( hello , hi
); my_function( hello , hi
);
}

Live Demo