从ANSI C99开始,有_Bool
或bool
通过stdbool.h
。但是否也有一个`printf'格式的bool指定器?
我的意思是像那段伪代码一样的东西。
bool x = true;
printf("%B\n", x);
这将打印。
true
bool没有格式指定器。你可以使用一些现有的打印积分类型的指定器来打印它,或者做一些更花哨的事情。
printf("%s", x?"true":"false");
ANSI C99/C11不包括一个额外的printf转换指定符bool
.但[GNU C库提供了添加自定义指定符的API][1]。
但是[GNU C库提供了一个添加自定义指定符的API][1]。
举个例子。
#include <stdio.h>
#include <printf.h>
#include <stdbool.h>
static int bool_arginfo(const struct printf_info *info, size_t n,
int *argtypes, int *size)
{
if (n) {
argtypes[0] = PA_INT;
*size = sizeof(bool);
}
return 1;
}
static int bool_printf(FILE *stream, const struct printf_info *info,
const void *const *args)
{
bool b = *(const bool*)(args[0]);
int r = fputs(b ? "true" : "false", stream);
return r == EOF ? -1 : (b ? 4 : 5);
}
static int setup_bool_specifier()
{
int r = register_printf_specifier('B', bool_printf, bool_arginfo);
return r;
}
int main(int argc, char **argv)
{
int r = setup_bool_specifier();
if (r) return 1;
bool b = argc > 1;
r = printf("The result is: %B\n", b);
printf("(written %d characters)\n", r);
return 0;
}
因为它是一个glibc扩展,GCC对该自定义指定器发出警告。
<pre>.$ gcc -Wall -g main.c -o main; $ gcc -Wall -g main.c -o main main.c: 在函数'main'中: main.c: 34: 3: 警告。 格式[-Wformat=]中未知的转换类型字符'B'。 r = printf("结果是:%B/n", b);。 %Bn/quot;, b); ^ main.c:34:3。 警告: 格式参数太多 [-Wformat-extra-args] 。
输出。
$ ./main 结果是。 假的 (21个字) $./main 1 结果是:真 (20个字)
[1]: http://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html
我更喜欢https://stackoverflow.com/questions/7617479/best-way-to-print-the-result-of-a-bool-as-false-or-true-in-c 的答案,就像
printf("%s\n", "false\0true"+6*x);