我只是想知道其中的区别,我已经尝试过在谷歌上搜索。
今天我学到了一些新东西。我从未使用过
_s
函数,并且始终假设它们是供应商提供的扩展,但它们实际上是在附件 K“边界检查接口”下的语言标准中定义的。关于printf_s
:
K.3.5.3.3函数printf_s
剧情简介
1运行时约束#define _ _STDC_WANT_LIB_EXT1_ _ 1 #include <stdio.h> int printf_s(const char * restrict format, ...);
2不得为空指针。format
说明符394)(是否由标志、字段修改 宽度或精度)不得出现在%n
指向的字符串中。任何论点 与format
说明符对应的printf_s
不得为空指针。%s
3 如果存在运行时约束违规,则函数不会尝试 产生进一步的输出,并且未指定printf_s
产生输出的程度 在发现运行时约束违规之前。printf_s
描述
4函数与printf_s
函数等效,除了显式的 上面列出了运行时约束。printf
退货
5函数返回传输的字符数,或者一个负数 如果发生输出错误、编码错误或运行时约束违规,则返回值。printf_s
394)字符按顺序出现在指向的字符串中并不是运行时约束违规 当这些字符不被解释为%n
说明符时,按格式。例如,如果整个 格式字符串为%n
。%%n
总而言之,
printf_s
对其参数执行了printf
未完成的额外运行时验证,并且如果任何运行时验证失败,则不会尝试继续。
_s
函数是可选,编译器不需要支持它们。如果它们受支持,宏__STDC_WANT_LIB_EXT1__
将被定义为1,所以如果你想使用它们,你需要像这样
#if __STDC_WANT_LIB_EXT1__ == 1
printf_s( "%s", "This is a test\n" );
#else
printf( "%s", "This is a test\n" );
#endif