将数字转换为宏中的字符串

时间:2012-11-01 07:17:02

标签: c

  

可能重复:
  Convert a preprocessor token to a string

#define num 1234

我想基于num定义一个“const char *”,在样本中它将是:

#define num_str "1234"

我可以写一个宏语句来实现这个目的吗? 注意:1234会改变。

感谢。

2 个答案:

答案 0 :(得分:3)

是的,你可以,但宏替换可能有点奇怪。双宏替换是有原因的,如果你考虑一段时间,就会明白为什么需要它。

#define STRINGIZER_(exp)   #exp
#define STRINGIZER(exp)    STRINGIZER_(exp)
#define NUM 1234

int main(int argc, char *argv[])
{
    const char *p = STRINGIZER(NUM);
    printf("%s\n",p);
    return EXIT_SUCCESS;
}

运行此:

1234

双重替换的原因:乍一看,人们可能认为这将解决问题:

#define STRINGIZER(exp)    #exp
#define NUM 1234

int main(int argc, char *argv[])
{
    const char *p = STRINGIZER(NUM);
    printf("%s\n",p);
    return EXIT_SUCCESS;
}

但这会产生:

NUM

这不是我们想要做的。如果您想首先实际扩展NUM宏,那么您必须这样做:强制扩展。通过强制预处理器将首先替换为中间扩展(如我在此答案的顶部所示),首先展开传入的宏,然后然后字符串化。

侧栏:此技术对于生成预定义预处理器宏的宽字符版本特别有用,否则它们将保留常规字符串。例如,__FILE__宏。假设您想要一个宽字符版本(前缀为'L'的字符串)您可能首先认为这将有效:

#define WIDESTR(str)    L##str

但是使用__FILE__进行扩展,如下所示:

const wchar *p = WIDESTR(__FILE__);

将导致编译器错误:"Undefined identifier: L__FILE__"

那么我们如何解决这个问题呢?就像我们上面做的那样。

#define WIDESTR_(str)       L##str
#define WIDESTR(str)        WIDESTR_(str)

int main(int argc, char *argv[])
{
    const wchar_t* p = WIDESTR(__FILE__);
    wcout << p << endl;
    return EXIT_SUCCESS;
}

在我的系统上,这会产生:

/Users/craig/tmp/main/main/test.cpp

结束......

作为一个安慰奖,我们将这个答案中的所有内容组合成一个巨大的混乱,当我们做这个时我们会发生什么:

int main()
{
    const wchar_t *p = WIDESTR(STRINGIZE(NUM));
    wcout << p << endl;
    return EXIST_SUCCESS;
}

答案 1 :(得分:0)

如何在代码的其余部分中使用字符串?它必须是一个字符串宏吗?从其他值创建字符串的标准方法是使用string.h中的sprintf()

#define num 1234
sprintf(string,"%d",num);