在使用许多标准 C 库函数的一些 Microsoft 安全版本时,我注意到其中一些函数似乎能够在编译时确定传入缓冲区是静态分配还是动态分配。如果输入缓冲区是静态分配的,该函数可以自动神奇地确定它的大小,但如果是动态的,则必须将大小作为另一个参数给出。
例如,这段代码在静态分配缓冲区时有效:
char buffer[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
但是这个不是:
char *buffer = new char[1024];
sprintf_s(buffer, "Hello World\n");
printf_s(buffer);
我已经尝试查看这些函数的定义,但代码主要是预处理器定义,很难理解。
所以我的问题是:这是如何确定的,这是标准的 C/C++ 语言功能还是某种 Microsoft 特定功能?
此外,其中一些函数看起来毫无意义,例如 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
通过重载,编译器可以在传递静态大小的数组时确定数组大小。这是标准的 C++,这里没有任何特定于 Microsoft 的内容(重载和命名除外)。
更多信息可在Secure Template Overloads下找到以及Parameter Validation .
关于c++ - Microsoft 的 C 库函数的 C++ 安全版本如何知道静态缓冲区的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255571/