c - 是否有计算 printf 格式字符串的参数数量的函数?

标签 c windows visual-studio

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

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)来告诉“正确”的参数数量。 如果参数太少,可能会发生不好的事情(“未定义的行为”),而多余的参数可能会被忽略。大多数现代编译器以编译时警告的形式提供一些帮助。

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

无论出于何种历史原因,该函数(显然)也没有被任何编译器套件提供。在大多数情况下,这是因为 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/

相关文章:

windows - 无法从 WinApi crate 调用 CryptDecrypt,因为它找不到模块

visual-studio - 如何在 Visual Studio 的特定文件夹中运行单个测试或所有测试?

visual-studio - Visual Studio 安装项目 - 有条件安装文件

c++ - Eclipse,C/C++,链接同一工作区中的两个项目

.net - Windows 7 中将包含哪个 .NET Framework 版本?

c - C表达式未提供正确的输出

c++ - OpenSSL SSL_read 失败(错误 :00000005:lib(0):func(0):DH lib)

.net - 在 Visual Studio 的设计模式下启用调试

c - asm ("nop");作品?

c - 奇怪的 C 错误 : Adding a print statement before a line makes it run, 但没有它它会出错