首先,我同意Radosław Cybulski的评论:依赖副作用是一件危险的事情。因此,请不要这样做。
至于抑制参数的打印,我认为没有内置的占位符,最好的方法可能是注释掉整个printf语句,并在其下方添加没有被抑制的版本。
话虽如此,我想到了两种(不太优雅的)解决方案,可以实现类似于您想要实现的功能:
方法1
您可以创建一个宏,如下所示:
#define SUPPRESS_PRINT(x) "\0"/*x*/
这将使用空终止字符替换参数。
然后,您可以像这样在printf语句中使用它:
printf("%d %d %s %d", A, B, SUPPRESS_PRINT(C), D);
请注意,C的占位符(即被抑制的参数)必须更改为%s,这是一个空终止字符串,以便这个“技巧”产生所需的结果。
更正:
感谢评论区jhx提供的绝妙建议,我已经完善了上述解决方案。使用顺序评估可以避免遗漏可能的副作用。修订后的宏如下:
使用方式与上述描述相同。
方法2
还有另一种可能更简单的解决方法。它是一个POSIX特性而不是C99特性,但我认为它在大多数情况下都能起作用。就是在每个格式占位符中使用参数字段。类似于这样:
printf("%1$d %2$d %3$d %4$d", A, B, C, D);
如果您想从输出中省略参数C,只需从格式字符串中删除%3$d即可。因此,得到以下内容:
printf("%1$d %2$d %4$d", A, B, C, D);
这可能是最简单的方法。
工作原理:参数字段将格式占位符与给定参数绑定,使用其序号。因此,即使您删除一个,其余部分仍将正确打印。
注意:据我测试,此方法不会省略副作用!
*printf
没有输出抑制修饰符,您需要删除不想打印的内容。 - John Bodeprintf("%d %d %d", A, (B, C), D);
(省略了B的结果)? - chux - Reinstate Monica