例如,这是 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。
答案 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);