gpt4 book ai didi

c - Printf 格式说明符和引号外的字段

转载 作者:行者123 更新时间:2023-12-04 12:12:37 25 4
gpt4 key购买 nike

我遇到了以下代码:

#define ERROR 0
#define WARN 1
#define INFO 2
#define DEBUG 3

extern int log_level;

char const *LEVEL_TO_STRING[] = { "ERROR", "WARN", "INFO", "DEBUG" };

#define LOG(level, s, ...) \
do \
{ \
if(level <= log_level) \
printf( "[%s] " s "\n", LEVEL_TO_STRING[level], ##__VA_ARGS__) \
} \
while(0) \

我不明白 sprintf 语句中的引号之外做了什么。我尝试搜索这是什么以及它是如何工作的,但我不确定要查找什么。有人可以向我解释这段代码是如何工作的吗?

作为后续,是否可以在宏之外编写如上示例的代码?我见过的最接近的是使用格式说明符:

#define FORMAT "ld"
long num = 1000000;
printf("%" FORMAT "\n", num);

这将有助于理解这两种情况在内部是如何工作的,以及为什么 C 不允许我做类似 printf("%s"s "\n", string1, string2) 的事情在上面的宏中完成。

编辑:不是How does concatenation of two string literals work? 的干净副本因为这篇文章特定于 printf(和格式说明符),因为它与宏相关。此外,在对这篇文章的回复中有一些有用的信息,而在其他文章中是没有的。

最佳答案

I do not understand what the s is doing outside the quotes in the printf statement

为了查看发生了什么,您需要记忆一下,s 在程序文本中被替换为 LOG 宏的第二个参数。唯一可行的方法是当 s 是一个 string literal 时,因为 C 合并了它们。换句话说,两者之间没有区别

"quick brown fox"

"quick" " brown " "fox"

这两种写字符串文字的形式是等价的。

同理,将"ld"传递给

中的 FORMAT
printf("%" FORMAT "\n", num);

相当于

printf("%ld\n", num);

并且是合法的。

why C does not let me do something like, printf("%s" s "\n", string1, string2) as is done in the macro above?

传递除字符串文字以外的任何内容都是非法的:

char FORMAT[] = "ld";
printf("%" FORMAT "\n", num); // <<== Does not compile
代码中的

sFORMAT 不能只是字符串,而是字符串文字:

#define s "[%s]"
...
printf("%s" s "\n", string1, string2); // This compiles

关于c - Printf 格式说明符和引号外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48284729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com