比如说,如果我执行以下操作:
const char *strFmt = "Value=%d, str=%s, v=%I64d. Is 100%% true";
printf(strFmt, 1, "name", -1);
有没有一个函数可以简单的返回strFmt
需要多少个参数而不填入?
最佳答案
想要所需参数数量的通常原因是检查一个人的代码。 C 运行时库作为 printf
函数的副作用来执行此操作。可以很容易地找到它们的源代码(以及类似的类似 printf 的函数,例如 Lynx 中的 StrAllocVsprintf
)。
因为 printf
是一个可变参数函数,所以没有预定义的原型(prototype)来告诉“正确”的参数数量。
如果参数太少,可能会发生不好的事情(“未定义的行为”),而多余的参数可能会被忽略。大多数现代编译器以编译时警告的形式提供一些帮助。
没有标准函数来计算所需参数的数量。这个问题之前已经被问过,例如,
- Linux script that counts number of printf parameters for each occurrence
- Passing too many arguments to printf
无论出于何种历史原因,该函数(显然)也没有被任何编译器套件提供。在大多数情况下,这是因为 printf
格式通常由编译器(或 lint
等静态分析工具)检查。并非所有编译器都会进行这些检查。可以告诉一些人,除了 printf
和它的标准亲戚之外的一些函数是“类似 printf 的”。 Visual Studio 缺少该功能,但可以执行一些 printf 检查(根据 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 编译器以外的其他工具检查它。
关于c - 是否有计算 printf 格式字符串的参数数量的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146836/