相关疑难解决方法(0)

将预处理程序标记转换为字符串

我正在寻找一种方法将预处理器令牌转换为字符串.

具体来说,我在某处得到了:

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

我愿意通过其他方式来完成同样的事情,但仅限标准库.

c stringification c-preprocessor

60
推荐指数
3
解决办法
7万
查看次数

如何从C宏的值创建一个char字符串?

例如,如何避免两次写'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)

c dry c-preprocessor

50
推荐指数
2
解决办法
10万
查看次数

C预处理器,对宏的结果进行字符串化

我想将宏扩展的结果字符串化.

我试过以下内容:

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

stringification c-preprocessor

41
推荐指数
2
解决办法
2万
查看次数

展开引用字符串中的宏

可能重复:
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\"");

c macros c-strings c-preprocessor

26
推荐指数
1
解决办法
3万
查看次数

使用C预处理器为scanf构造字符串文字?

我正在尝试创建一个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.

建议?

c string concatenation scanf c-preprocessor

1
推荐指数
1
解决办法
1313
查看次数