Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C __printflike_uu;修饰符_C_Printf_Modifier - Fatal编程技术网

C __printflike_uu;修饰符

C __printflike_uu;修饰符,c,printf,modifier,C,Printf,Modifier,什么是“\uuuu printflike\uuuuu”修饰语?这个词是什么意思 猜测一下,它会告诉您正在使用的编译器,函数以[anything,]format,…的形式接受参数,其中format,…部分看起来像printf的参数。\uuuu printflike\uuu属性允许编译器根据字符串格式测试参数列表中的类型。当您编写类似于log(format,…)的函数,并使用vsprintf将格式化工作从属于通常的标准库函数,然后再将字符串发送到某些特殊的日志接口时,就会出现这种情况 如果您使用的是

什么是“\uuuu printflike\uuuuu”修饰语?这个词是什么意思

猜测一下,它会告诉您正在使用的编译器,函数以
[anything,]format,…
的形式接受参数,其中
format,…
部分看起来像
printf
的参数。
\uuuu printflike\uuu
属性允许编译器根据字符串格式测试参数列表中的类型。当您编写类似于
log(format,…)
的函数,并使用
vsprintf
将格式化工作从属于通常的标准库函数,然后再将字符串发送到某些特殊的日志接口时,就会出现这种情况

如果您使用的是GCC,那么它可能是项目中的一个
#define
,类似于:

#define __printflike__ __attribute__((format(printf, 1, 2)))

其中
1,2
表示
格式,
出现在位置1和2。

可能告诉编译器相应的函数具有类似
printf
的语义

这样,当格式字符串中的修饰符与传递的参数的类型或计数不对应时,编译器可以在编译时发出警告

当调用
printf
sprintf
fprintf
等时,编译器没有其他方法可以告诉您
%u
不是
int
的正确格式


几个月前,我问了一个相反的问题:

我的错误报告库中有一个函数,在标题中声明如下:

extern void err_logmsg(FILE *fp, int flags, int estat, const char *format, ...)
                       PRINTFLIKE(4,5);
PRINTFLIKE是大写的,所以当我不使用GCC时,我可以将它定义为nothing。这个用法表示前三个参数没有什么特殊之处,但第四个参数是一个格式字符串,与
printf()
使用的格式字符串类似(实际上,在内部,它被传递到
vfprintf()
),与之对应的参数(使用格式字符串格式化)从第五个参数开始

这意味着如果我键入:

err_logmsg(stdout, ERR_ABORT, 1, "%s: %d\n", errno, strerror(errno));
我将得到一个编译错误,因为
errno
是一个
int
并且
strerror(errno)
返回一个指向字符串的指针。我可以通过更改格式字符串或第五个和第六个参数来修复错误。(ERR_ABORT是在声明
ERR_logmsg()
的相同标头中定义的一组标志)

PRINTFLIKE宏中有两个数字,因为在格式字符串和格式字符串使用的第一个参数之间可能有其他参数。例如,替代功能可以是:

extern void err_writer(FILE *fp, const char *format, int flags, int estat, ...)
                       PRINTFLIKE(2,5);
这会告诉编译器格式化字符串是第二个参数,但格式化后的相应参数仍然从第五个参数开始显示

此代码的头文件包含以下行:

#ifdef __GNUC__
#define PRINTFLIKE(n,m) __attribute__((format(printf,n,m)))
#define NORETURN()      __attribute__((noreturn))
#else
#define PRINTFLIKE(n,m) /* If only */
#define NORETURN()      /* If only */
#endif /* __GNUC__ */

你在什么背景下看待它?(您使用的是什么编译器?)unix上的gcc版本4.2.1。我对这个术语一无所知,想了解它的基本含义。GCC不使用
\uu printflike\uu
标识符。它使用语法
\uuuu属性(格式(printf,n,m))
,并且从那时起至少有版本3.3。如果它存在于您的代码中,您应该发布一段您在其中看到的代码片段,以便我们可以为您提供更多帮助。