wchar_t printf() format warning
Joel Sherrill
joel.sherrill@oarcorp.com
Thu Mar 19 15:32:00 GMT 2015
On 3/18/2015 4:46 PM, Jonathan Roelofs wrote:
>
> On 3/18/15 3:29 PM, Joel Sherrill wrote:
>> Hi
>>
>> I am returning to this issue. This appears to be similar to the
>> intptr_t issue but with wchar_t. We get a printf() warning on
>> targets where wchar_t is defined is defined as "long int" and
>> not on targets where it is "int". This appears to be because
>> of a conflict in the definition of __WINT_TYPE__ and
>> __WCHAR_TYPE__ by gcc. I am open to suggestions on how
>> to resolve this.
>>
>> $ sparc-rtems4.11-gcc -dM -E - </dev/null | grep WCHAR_TYPE
>> #define __WCHAR_TYPE__ long int
>> $ i386-rtems4.11-gcc -dM -E - </dev/null | grep WCHAR_TYPE
>> #define __WCHAR_TYPE__ int
>> $ sparc-rtems4.11-gcc -dM -E - </dev/null | grep WINT_TYPE
>> #define __WINT_TYPE__ unsigned int
>> $ i386-rtems4.11-gcc -dM -E - </dev/null | grep WINT_TYPE
>> #define __WINT_TYPE__ unsigned int
>>
>>
>> sparc generates this warning but i386 does not:
>>
>> $ sparc-rtems4.11-gcc -Wall -c wc.c
>> wc.c: In function 'f':
>> wc.c:10:3: warning: format '%lc' expects argument of type 'wint_t', but
>> argument 4 has type 'wchar_t' [-Wformat=]
>> (void)printf("%*s%lc\n", pad, "", wc);
>> ^
>> wc.c:10:3: warning: format '%lc' expects argument of type 'wint_t', but
>> argument 4 has type 'wchar_t' [-Wformat=]
>>
>>
>> This is the test case:
>>
>> =================
>> #include <stdio.h>
>> #include <wchar.h>
>>
>> void f(void)
>> {
>>
>> int pad = 10;
>> wchar_t wc = 'a';
>>
>> (void)printf("%*s%lc\n", pad, "", wc);
> §7.19.6.1 7:
>
> "l (ell)
> Specifies that a following d, i, o, u, x, or X conversion specifier
> applies to a long int or unsigned long int argument; that a following n
> conversion specifier applies to a pointer to a long int argument; that a
> following c conversion specifier applies to a wint_t argument; that a
> following s conversion specifier applies to a pointer to a wchar_t
> argument; or has no effect on a following a, A, e, E, f, F, g, or G
> conversion specifier."
>
> You need a cast for the last argument: (wint_t)wc
>
I left out the disclaimer that this a cut down of code ported to RTEMS from
FreeBSD.
I am adding a cast and moving along. I do wonder if gcc should be more
consistent in how these types are defined but that would be harder to
justify, fix, and test than it is probably worth.
Thanks.
> Cheers,
>
> Jon
>
>> }
>> =================
>>
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the Newlib
mailing list