我正在寻找一种方法将预处理器令牌转换为字符串.
具体来说,我在某处得到了:
#define MAX_LEN 16
Run Code Online (Sandbox Code Playgroud)
我想用它来防止缓冲区溢出:
char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);
Run Code Online (Sandbox Code Playgroud)
我愿意通过其他方式来完成同样的事情,但仅限标准库.
例如,如何避免两次写'func_name'?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
Run Code Online (Sandbox Code Playgroud)
我想遵循单点真相规则.
C预处理器的版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
Run Code Online (Sandbox Code Playgroud) 我想将宏扩展的结果字符串化.
我试过以下内容:
#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)
Run Code Online (Sandbox Code Playgroud)
并且TESTE扩展到:"TEST",而我正试图获得"thisisatest".我知道这是预处理器的正确行为,但任何人都可以帮我找到另一种方法吗?
Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do
Run Code Online (Sandbox Code Playgroud) 可能重复:
C宏以创建字符串
我有一个函数接受一个类型的参数char*
,比如f("string");
如果字符串参数是在函数调用中由-the-fly定义的,那么如何在字符串体内扩展宏呢?
例如:
#define COLOR #00ff00
f("abc COLOR");
Run Code Online (Sandbox Code Playgroud)
相当于
f("abc #00ff00");
Run Code Online (Sandbox Code Playgroud)
但相反,不执行扩展,并且函数从字面上接收abc COLOR
.
特别是,我需要精确地扩展宏\"#00ff00\"
,以便这个引用的标记与传递给它的其余字符串参数连接f()
,包括引号; 也就是说,预处理器必须完成他的工作并欢迎编译器将代码转换f("abc COLOR");
为f("abc \"#00ff00\"");
我正在尝试创建一个sscanf
字符串文字,以帮助在C99中防止缓冲区溢出.目标是这样的:
#define MAX_ARG_LEN 16
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
显而易见的"手动"解决方案如下:
#define MAX_ARG_LEN 16
#define MAX_ARG_CHARS "15"
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
但是,我希望在缓冲区大小为16的情况下自动生成"%15X".这个链接几乎适用于我的应用程序:将预处理程序标记转换为字符串,但它不处理-1.
建议?