On 2/17/19 7:12 AM, Jonny Grant wrote:
Hello
**Please keep my email address in any replies.
1) should this not give type conversion warnings?
printf("lineoutput %d:%u:%i\n", __LINE__, __LINE__, __LINE__);
2) Should __LINE__ expand as an 'int', or 'unsigned int'?
Had expected line 9 to expand as '9U', but -save-temps shows it ends up as:
printf("lineoutput %d:%u:%i\n", 9, 9, 9);
The bigger problem with __LINE__ is that it need not expand to int
at all, such as in the following:
$ cat u.c && gcc -O2 -S -Wall -Wextra u.c
#line 2147483647
void f (void)
{
__builtin_printf ("%i", __LINE__);
}
u.c: In function ‘f’:
u.c:-2147483646:21: warning: format ‘%i’ expects argument of type ‘int’,
but argument 2 has type ‘long int’ [-Wformat=]
Notice how the line number in the message doesn't correspond to
the sum of 2147483647 and 3 (the offset from the #line directive).
Martin
C spec has §6.10.8
6.10.8 Predefined macro names
_ _LINE_ _ The presumed line number (within the current source file) of
the current
source line (an integer constant). 155)
Cheers, Jonny
/* gcc -pedantic -ansi -Wall -Wconversion -Wsign-conversion -c -o
print_d_u print_d_u.c */
#include <stdio.h>
int main()
{
printf("lineoutput %d:%u:%i\n", __LINE__, __LINE__, __LINE__);
return 0;
}