我可以使用C-preprocssor将整数转换为字符串吗?

时间:2013-03-05 22:11:42

标签: c

必须有办法做到这一点......

我有一个头文件,version.h有一行......

#define VERSION 9

并且一些文件使用定义的VERSION值作为整数。 没关系。

在不改变定义VERSION的方式的情况下,我需要构建一个 初始化"什么"包含该值的字符串, 所以我需要这样的东西......

char *whatversion = "@(#)VERSION: " VERSION;
显然这不会编译,所以不知怎的,我需要得到一个 VERSION的预处理值的字符串基本上给出了这个......

char *whatversion = "@(#)VERSION: " "9";

有什么想法吗? 这可能吗?

2 个答案:

答案 0 :(得分:5)

它不是数据类型,而是令牌。一团文字。

K & R谈论连接值:

 The preprocessor operator ## provides a way to concatenate actual arguments
 during macro expansion. If a parameter in the replacement text is adjacent
 to a ##, the parameter is replaced by the actual argument, the ## and
 surrounding white space are removed, and the result is re-scanned. For example,
 the macro paste concatenates its two arguments:

    #define paste(front, back) front ## back

    so paste(name, 1) creates the token name1.

- 尝试一下。在到达char *version=

之前#define字符串

答案 1 :(得分:0)

在宏中,您可以使用“stringify”运算符(#),它将完全按照您的要求执行:

#define STR2(x) #x
#define STR(x) STR2(x)
#define STRING_VERSION STR(VERSION)

#define VERSION 9

#include <stdio>
int main() {
  printf("VERSION = %02d\n", VERSION);
  printf("%s", "@(#)VERSION: " STRING_VERSION "\n");
  return 0;
}

是的,你需要宏调用中的双重间接。没有它,您将获得"VERSION"而不是"9"

您可以在gcc manual中详细了解这一点(尽管它是完全标准的C / C ++)。