【问题标题】:Stringification Parentheses Elimination字符串化括号消除
【发布时间】:2013-08-29 03:17:45
【问题描述】:

在 c 中,我在现有代码库中有以下内容:

#define MYVAR (1)

正如你所看到的,这是通过用括号括起来 #define 来符合 C 中的良好实践(尽管我知道在这种情况下它没有区别,因为值不是 一种表达)。无论如何,我想在字符串化中使用它。当我这样做时:

#define STRINGIFY(x) #x
#define TO_STRING(x) STRINGIFY(x)

const char* mystring = TO_STRING(MYVAR) ;

结果字符串是“(1)”。我想删除括号而不做简单的事情:

#define MYVAR 1

在c中的字符串化过程中是否有消除括号的方法?

【问题讨论】:

  • 由于这是在预处理阶段,并且您已明确定义 MYVAR 替换为(1) 我不相信您正在寻找的是可行的。如果是这样,我无法想象如果没有非常特定于 cpp-backend 的情况。
  • 我害怕那个。谢谢
  • 我不相信用括号括起来的文字一定是好的做法,它甚至可能让人相信它是宏语法的一部分。
  • @Veltas 部分避免宏扩展的意外副作用是非常的常见做法。首先,我不喜欢复杂的预处理器宏,但是为了确保扩展的值而不是引用扩展,它不仅很常见,而且建议。 (对 OP 没有任何帮助,但它仍然是正确的)。
  • @WhozCraig:我说的是文字。仅仅因为它是常见的做法并不意味着它是好的做法。我不确定我是否看到在宏定义中特别用括号包围文字的意义,它看起来很麻烦。

标签: c c-preprocessor stringify


【解决方案1】:

只需使用STRINGIFY x 而不是STRINGIFY(x)

#include <stdio.h>

#define MYVAR 1

#define STRINGIFY(x) #x
#define TO_STRING(x) STRINGIFY x

int main(void)
{
    const char *mystring = TO_STRING(MYVAR);

    printf("%s\n", mystring);
    return 0;
}

MYVAR 定义为 (1) 时,TO_STRING(x) 扩展为 STRINGIFY (1)

如果 MYVAR 定义为 1 不带括号,则会出现编译时错误。

【讨论】:

  • 我已经确认这行得通,但你能解释一下吗?例如为什么我们需要这些步骤。
猜你喜欢
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多