我正在寻找一种方法将预处理器令牌转换为字符串.
具体来说,我在某处得到了:
#define MAX_LEN 16
我想用它来防止缓冲区溢出:
char val[MAX_LEN+1]; // room for \0 sscanf(buf, "%"MAX_LEN"s", val);
我愿意通过其他方式来完成同样的事情,但仅限标准库.
具体请参见http://www.decompile.com/cpp/faq/file_and_line_error_string.htm:
#define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #define AT __FILE__ ":" TOSTRING(__LINE__)
所以你的问题可以通过这样做来解决
sscanf(buf, "%" TOSTRING(MAX_LEN) "s", val);
我在网上找到了答案.
#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR以上不起作用,但希望说明我想做什么,即使VERSION_STRING结束为"v4.47".
要生成正确的数字形式,请使用类似的内容
#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define STRINGIZE2(s) #s #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_STRING "v" STRINGIZE(VERSION_MAJOR) \ "." STRINGIZE(VERSION_MINOR) #includeint main() { printf ("%s\n", VERSION_STRING); return 0; }
已经有一段时间了,但这应该有效:
sscanf(buf, "%" #MAX_LEN "s", val);
如果没有,它将需要"双扩展"技巧:
#define STR1(x) #x #define STR(x) STR1(x) sscanf(buf, "%" STR(MAX_LEN) "s", val);