What is the printf format specifier for bool?
There is no format specifier for bool
types. However, since any integral type shorter than int
is promoted to int
when passed down to printf()
's variadic arguments, you can use %d
:
bool x = true;printf("%d\n", x); // prints 1
But why not:
printf(x ? "true" : "false");
or, better:
printf("%s", x ? "true" : "false");
or, even better:
fputs(x ? "true" : "false", stdout);
instead?
ANSI C99/C11 don't include an extra printf conversion specifier for bool
.
But the GNU C library provides an API for adding custom specifiers.
An example:
#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;}
Since it is a glibc extensions the GCC warns about that custom specifier:
$ gcc -Wall -g main.c -o mainmain.c: In function ‘main’:main.c:34:3: warning: unknown conversion type character ‘B’ in format [-Wformat=] r = printf("The result is: %B\n", b); ^main.c:34:3: warning: too many arguments for format [-Wformat-extra-args]
Output:
$ ./mainThe result is: false(written 21 characters)$ ./main 1The result is: true(written 20 characters)