misleading warning message

Jonathan Wakely jwakely.gcc@gmail.com
Thu Jun 8 09:04:00 GMT 2017


On 7 June 2017 at 22:11, massimiliano cialdi  wrote:
> gcc 6.3.0, compile this:
>
> #include <stdio.h>
>
> int main(void)
> {
>     printf("%Ld\n",3L);
>     printf("%llf\n", 3.3L);
>     return 0;
> }
>
> this is the output:
> $ gcc -pedantic -std=c99 -Wall test.c -o test
> test.c: In function ‘main’:
> test.c:5:12: warning: ISO C does not support the ‘%Ld’ gnu_printf format
> [-Wformat=]
>   printf("%Ld\n",3L);
>             ^
> test.c:5:12: warning: format ‘%Ld’ expects argument of type ‘long long int’,
> but argument 2 has type ‘long int’ [-Wformat=]
> test.c:6:13: warning: use of ‘ll’ length modifier with ‘f’ type character
> has either no effect or undefined behavior [-Wformat=]
>   printf("%llf\n", 3.3L);
>              ^
>
> the warning about '%Ld' is misleading. I was expecting something like "use
> of ‘L’ length modifier with ‘d’ type character has either no effect or
> undefined behavior", otherwise it looks that '%Ld' is allowed and require
> ‘long long int’.

But it is allowed by GNU libc, that's the point. For GNU libc %Ld
means the same as %lld, but that's non-standard, so when you use
-pedantic you get a warning.

So it does have an effect, and it isn't undefined.

> also printf(3) manpage says:
>
> *"L:* A following *a*, *A*, *e*, *E*, *f*, *F*, *g*, or *G* conversion
> corresponds to a /long double/ argument."

On my system it also says "This is a synonym for ll."



More information about the Gcc-help mailing list