【问题标题】:Is there a function to count number of parameters for a printf format string?是否有计算 printf 格式字符串的参数数量的函数?
【发布时间】:2015-07-20 17:27:51
【问题描述】:

说,如果我执行以下操作:

const char *strFmt = "Value=%d, str=%s, v=%I64d. Is 100%% true";
printf(strFmt, 1, "name", -1);

有没有一个函数可以简单地返回strFmt需要多少个参数而不填写它们?

【问题讨论】:

  • 你可以数出未被另一个%转义的%的数量。
  • @DanielA.White:我显然可以这样做......除了假设当前格式永远不会改变是不安全的。换句话说,谁能保证他们以后不会想出一个新的格式,比如%%i?这就是为什么我一直在寻找一个内置函数来做到这一点......
  • @c00000fd: %%i 表示文字 % 后跟 i。它的意义不能改变。如果您看到任何没有定义含义的转义,您可以做的是返回错误,因为这些是将来可以分配新含义的唯一形式(并且由于行为未定义,它们现在使用起来很危险)。
  • @DanielA.White 不完全:"%*.*f" 需要 3 个参数,而不是 1 个。

标签: c windows visual-studio


【解决方案1】:

需要所需参数数量的通常原因是检查代码。 C 运行时库将此作为printf 函数的副作用。这些(以及类似 printf 的函数,例如 Lynx 中的 StrAllocVsprintf)的源代码很容易找到。

因为printf 是一个可变参数函数,所以没有预定义的原型可以告诉“正确”的参数数量。 如果参数太少,可能会发生不好的事情(“未定义的行为”),而多余的可能会被忽略。大多数现代编译器以编译时警告的形式提供一些帮助。

没有标准函数来计算所需参数的数量。这个问题之前已经问过,例如,

无论出于什么历史原因,该函数也(显然)没有由任何编译器套件提供。在大多数情况下,这是因为printf 格式通常由编译器(或lint 等静态分析工具)检查。并非所有编译器都进行这些检查。除了printf 和它的标准亲戚之外的一些功能可以告诉一些人是“类似printf”的。 Visual Studio 缺少该功能,但可以进行 一些 printf-checking(根据Is there any way to make visual C++ (9.0) generate warnings about printf format strings not matching type of printf's args? 不是很多)。

编译器不会将字符串常量与printf 函数相关联。您可以将其设为#define 并在实际的printf 函数中重用该值,以获取编译器可以做的任何检查。

例如

#define strFmt "Value=%d, str=%s, v=%I64d. Is 100%% true"
printf(strFmt, 1, "name", -1);

问题本身是可移植的:如果您的程序也是可移植的,您可以使用 Visual Studio 编译器以外的其他工具进行检查。

【讨论】:

  • 正如我在标签中指出的那样,我需要它用于 Windows/Visual Studio。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多