On Sun, 5 Oct 2025 22:58:43 +0200, Bernd Oppolzer <[email protected]>
wrote:
>Now that I know that this feature is not standard C, I'm sort of
>relieved that I didn't know about it
>and "fixed" the problem in my recent answer by simply removing the 1$
>etc. flags, which didn't tell me anything :-)
>
>Another remark from the view point of a compiler builder: these nn$
>flags, which allow the addressing of the
>subsequent parameters of printf etc. out of sequence (say, by index),
>require that all the parameters or addresses
>of printf are placed in a vector of appropriate size, so that they can
>be referenced later. The size of this vector
>is the NL_ARGMAX constant mentioned earlier. This vector etc. is not
>necessary, if the parameters are processed
>in the same sequence as the % tags appear in the printf pattern, which
>is also faster IMO.
>So I'm not surprised that this feature is not part of the C (library)
>standard.
>
>BTW: I really hope that clever C compilers do some optimization on
>printf and similar function calls,
>given constant patterns - and maybe extended diagnostics, such as: do
>the parameters agree with the tags in
>the pattern? Does the count of parameters match the number of tags in
>the pattern?
>If the patterns are variables, then, of course, there is no chance ...
>
>Kind regards
>
>Bernd
>
Yes, the newer Open XL C/C++ compiler does check for things like this. Helps
avoid nasty bugs and issues in your code so a great thing to take advantage of.
For example, the following program will let you know about type mismatch, too
many arguments, and too few arguments!
- a.c –
#include <stdio.h>
int main(void) {
printf("Hello World! Year: %s, %s\n", __DATE__, __LINE__, __STDC_VERSION__);
printf("Hello World! Year: %s, %s\n", __DATE__, "hehe", __LINE__,
__STDC_VERSION__);
printf("Hello World! Year: %s, %s\n", __DATE__);
return 55;
}
- end a.c -
> ibm-clang a.c
>
a.c:4:51: warning: format specifies type 'char *' but the argument has type
'int' [-Wformat]
4 | printf("Hello World! Year: %s, %s\n", __DATE__, __LINE__,
__STDC_VERSION__);
| ~~ ^~~~~~~~
| %d
<scratch space>:6:1: note: expanded from here
6 | 4
| ^
a.c:5:59: warning: data argument not used by format string [-Wformat-extra-args]
5 | printf("Hello World! Year: %s, %s\n", __DATE__, "hehe", __LINE__,
__STDC_VERSION__);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
<scratch space>:7:1: note: expanded from here
7 | 5
| ^
a.c:6:35: warning: more '%' conversions than data arguments
[-Wformat-insufficient-args]
6 | printf("Hello World! Year: %s, %s\n", __DATE__);
| ~^
3 warnings generated.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN