在使用许多标准C库函数的一些Microsoft安全版本时,我注意到这些函数中的一些似乎能够在编译时确定传入缓冲区是静态还是动态分配的.如果输入缓冲区是静态分配的,则函数可以自动地确定它的大小,但如果是动态的,则必须将该大小作为另一个参数给出.
例如,当静态分配缓冲区时,此段代码有效:
char buffer[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
Run Code Online (Sandbox Code Playgroud)
但是这个没有:
char *buffer = new char[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
Run Code Online (Sandbox Code Playgroud)
我已经尝试过查看这些函数的定义,但代码主要是预处理程序定义,试图遵循这些定义非常容易混淆.
所以我的问题是:这是如何确定的,这是一个标准的C/C++语言功能还是某种微软特定的功能?
其中一些函数似乎没有意义,就像printf_s()具有与printf()完全相同的函数定义,那么为什么他们甚至有这个呢?
如果有人能够对此有所启发,我会很感激.
如果你看一下sprintf_s,_sprintf_s_l,swprintf_s,_swprintf_s_l的参考文档,你会发现以下声明:
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument] ...
);
template <size_t size>
int sprintf_s(
char (&buffer)[size],
const char *format [,
argument] ...
); // C++ only
Run Code Online (Sandbox Code Playgroud)
通过重载,编译器可以在传递静态大小的数组时确定数组大小.这是标准的C++,这里没有Microsoft特有的(除了重载和命名).