【问题标题】:Explain this C macro used for string comparison with strcmp()用 strcmp() 解释这个用于字符串比较的 C 宏
【发布时间】:2017-05-08 15:01:00
【问题描述】:

谁能解释一下这个宏的作用和工作原理?

#define STRCMP(a, R, b) (strcmp(a, b) R 0)

在代码中它被用作:if(STRCMP(some_string, "==", " blabla"))

宏中的R 0 是什么意思? if 语句中的宏在做什么?

【问题讨论】:

  • 手动展开就可以了。
  • "==" --> == ?
  • 我不希望 STRCMP(some_string, "==", " blabla") 正确编译。我很惊讶它不是STRCMP(some_string, ==, " blabla")
  • 正如 BLUEPIXY 指出的那样,由于== 周围有双引号,因此无法编译。需要去掉双引号。但这是一个令人困惑的宏。
  • @RichardChambers - 再次证明一个可以做某事并不意味着一个应该做某事。 :-)

标签: c string if-statement macros


【解决方案1】:

你可以自己做扩展:

if(STRCMP(some_string, "==", " blabla"))

if((strcmp(some_string, " blabla") "==" 0 ))

不幸的是,我认为在 "==" 周围加上引号会使其不正确,并且可能无法编译。

正确的语法是:

if(STRCMP(some_string, ==, " blabla"))

这是一个测试变量some_string 是否代表文本" blabla",通过使用==!= 比较。 (与 C 中的其他值一样)

【讨论】:

    【解决方案2】:

    首先你的意思是:

    if(STRCMP(some_string, ==, " blabla"))
    

    而不是:

    if(STRCMP(some_string, "==", " blabla"))
    

    即等号周围没有引号!


    R 代表==,0 代表strcmp() 的结果。

    所以当你这样做时:

    STRCMP(some_string, ==, " blabla")
    

    那么您的宏将具有:

    • asome_string
    • R==
    • b 为“blabla”

    这将是:

    (strcmp(a, b) R 0)
    

    变成这样:

    (strcmp(some_string, " blabla") == 0)
    

    检查some_string 是否为“blabla”。如果是,则括号的内容为1,即为真,否则为假。

    【讨论】:

      【解决方案3】:

      啊很好的例子....(但有点矫枉过正) 这基本上是执行不同关系运算符的棘手方法。 您使用==< 等。它基本上具有字典比较。

      检查strcmp()。它是返回值。

      宏不过是文本扩展。因此,当您扩展它时,您可以理解它。

      这个函数strcmp(str1,str2)的返回值如下:

      if Return value < 0 then it indicates str1 is less than str2.
      
      if Return value > 0 then it indicates str2 is less than str1.
      
      if Return value = 0 then it indicates str1 is equal to str2.
      

      顺便说一句,如果您像“==”那样输出它,那么该操作将不起作用。你必须使用 ==

      if(STRCMP(some_string, ==, " blabla")) --> correct use.
      

      为什么“==”不起作用?

      你只需更换它。展开宏..它涉及 if(STRCMP(some_string, "==", " blabla"))--> (strcmp(a, b) "==" 0) 不符合 C 语法。

      【讨论】:

      • @abelenky>:噢,错过了……我会向 OP 解释整个事情,为什么会这样?……如果你没问题的话。
      • @abelenky.: 如果是现在..请删除 dv,因为它给人的印象是 WA,而我的肯定不是。谢谢你顺便指点。
      【解决方案4】:

      在宏中,R 参数是==。所以宏展开为:

      (strcmp(a, b) == 0)
      

      在这种情况下,它正在测试两个字符串是否相同。如果strcmp() 返回 0,则表示两个字符串包含相同的字符。

      也就是说,这是一个愚蠢的宏,你不应该使用它。

      编辑:下面的评论是正确的,== 周围不应该有引号,否则它仍然会在替换中被引用。 OP 回复说引号是一个错字,所以我已经从我的答案中删除了引号。

      【讨论】:

      • "==" 周围的引号保留在宏替换中,使表达式:strcmp(a, b) "==" 0),无效。
      • R 参数是 "==" 而不是 ==。我希望宏扩展为(strcmp(a, b) "==" 0),我希望在编译时会失败。但话虽如此,“哑宏”+1。 :-)
      • 谢谢你们!引号是不正确的,一些错字)))
      • @P.Alex 很高兴我们提供了帮助。 接受请回答。 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2013-10-29
      相关资源
      最近更新 更多