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

Reply via email to