将预处理器标记转换为string

我正在寻找一种方法来将预处理器标记转换为string。

具体来说,我在某个地方得到了:

#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);

我在网上find了答案。

 #define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR 

以上不起作用,但希望说明我想做什么,即使VERSION_STRING结束为“v4.47”。

要生成正确的数字forms使用类似的东西

 #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) #include <stdio.h> int 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); 

你应该使用双扩展stringmacros技巧。 或者只是有一个

 #define MAX_LEN 16 #define MAX_LEN_S "16" char val[MAX_LEN+1]; sscanf(buf, "%"MAX_LEN_S"s", val); 

并保持同步。 (这有点麻烦,但是只要定义相邻,你可能会记得。)

其实在这个特殊的情况下,是不是可以满足呢?

 strncpy(val, buf, MAX_LEN); val[MAX_LEN] = '\0'; 

如果是printf ,那么这将会更容易:

 sprintf(buf, "%.*s", MAX_LEN, val); 

虽然上面的一些“工作”,我个人build议只使用一个简单的stringAPI,而不是libc中的dreck。 有许多可移植的API,其中一些也被优化以便于包含在你的项目中…有些像ustr有小的空间开销和支持堆栈variables。