【问题标题】:Macro definition that matches two strings匹配两个字符串的宏定义
【发布时间】:2016-01-19 13:22:28
【问题描述】:

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

  • 表达式为:

    MATCH 字符串 WITH other_string

其中 string 和 other_string 不需要 " "

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

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

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

  • 更新

我想打电话 MATCH hello WITH hi

在我的主要功能中

int main(){ 

    MATCH hello WITH hi

}

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

【问题讨论】:

  • 我认为在我的示例中很清楚 hello 和 hi 中没有“”。唯一的问题是我将如何定义这样的东西才能有效。我想将未引用的参数视为变量名

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


【解决方案1】:

使用宏使您的代码看起来像另一种语言总是令人怀疑的。最好考虑为您的“元语言”使用单独的解析器,为您生成 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

【讨论】:

  • 非常感谢,我修改了代码并使其工作。再次感谢:)
  • 不客气。由于您似乎是该网站的新手,我建议您通过tour
【解决方案2】:

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

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

这样:

MATCH_WITH(testing, testing)

变成:

MATCH "testing" WITH "testing"

【讨论】:

  • 我认为这是尽可能接近的,但它与 OP 所需的语法不匹配,如果 str1 或 str2 包含逗号,则会失败
  • 我真的不想达到这个结果。我的意思是我想在我的主函数 int main(){ MATCH hello WITH hi } 中调用 MATCH hello WITH hi 并调用我的函数来比较它们. hello 和 hi 都不能要求 ""
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多