#define string with numeric define

时间:2014-01-15 11:49:49

标签: c constants c-preprocessor

例如,这是 C 公共#define

#define USERNAME_LEN  100
#define SCAN_FMT  "%100s"

// str is input from somewhere
char username[USERNAME_LEN + 1];
ret = sscanf(str, SCAN_FMT, username);
// check ret == 1 ? 

我们可以有类似的东西:

#define SCAN_FMT   "%" USERNAME_LEN "s"

当然,这种语法不是我们想要的,而是最终目标 是将数字#define混合到字符串#define

注意:我知道我们可以做类似的事情:

sprintf(SCAN_FMT, "%%ds", USERNAME_LEN); // char SCAN_FMT[10];

但这不是我要找的,因为它需要运行时生成, 最好的是基于ANSI-C或std99。

2 个答案:

答案 0 :(得分:2)

您可以将预处理程序指令用于这类任务。

1.第一个指令是#允许你做这些事情:

#define str(x) #x
cout << str(test);

这将被翻译成:

cout << "test";

2.第二个指令是##:

#define glue(a,b) a ## b
glue(c,out) << "test";

将被翻译成:

cout << "test";

点击此处查看更多信息preprocessor

答案 1 :(得分:2)

您可能喜欢这样做:

#define SCAN_FMT_STRINGIFY(max) "%"#max"s"
#define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max)

#define USERNAME_MAXLEN (100)

...

  char username[USERNAME_MAXLEN + 1] = ""; /* Add one for the `0`-terminator. */
  int ret = sscanf(str, SCAN_FMT(USERNAME_MAXLEN), username);