std :: strftime返回值
我想我读的地方,如果我通过一个nullptr到std::strftime,该函数将返回所需的缓冲区大小。事实上,下面的代码工作得很好众多Linux系统上,我试图在(与VS尽管编译时):std :: strftime返回值
#include <iostream>
#include <ctime>
#include <string>
int main()
{
std::time_t time{};
std::tm const * ltime = std::localtime(&time);
const char * formatString = "%Y-%b-%d";
//allocate buffer of appropriate size
auto requiredSize = 1 + std::strftime(nullptr, 50, formatString, ltime);
std::cout << "Required buffer size:" << requiredSize << "\n";
//Format time to string
std::string buff(requiredSize, ' ');
std::strftime(&buff[0], requiredSize, formatString, ltime);
std::cout << buff << std::endl;
}
但是,我无法找到我的原始来源或任何其他文件是会指定这种行为。所以我的问题是:
- 在哪些系统/编译器/标准库实现(如果有)这是一个保证的行为?
- 我在哪里可以找到相应的文档?
编辑:我添加e标记,因为我已经看到了等价的C代码和至少用gcc /克相同的结果++(或更确切地说的glibc /的libstdC++)std::strftime
可能只是针对C-别名无论如何,功能strftime
。
据我所知和其他人在评论中写道,根据ISO C或C++标准,上面的代码很可能是未定义的行为,并且就我自己的实验而言,在使用VS2015编译时会崩溃。
然而,就glibc的来讲,@rici是在现货:
如果s是一个空指针,strftime的实际上并没有写任何东西,但而是返回它将写入的字符数。
如果您提到此行为未由C或C++标准或POSIX指定,此答案将得到改进。对于非glibc的实现,将空指针作为第一个参数传递给'strftime'具有未定义的行为。 (当然,返回有用的信息与未定义的行为完全一致。) –
@KeithThompson:添加了一条评论来明确指出这一点 – MikeMB
一个诡辩:这是一个glibc问题;它与gcc或g ++没有直接关系。例如,你可以在glibc中使用clang或clang ++,并且可以在其他库实现中使用gcc或g ++。 –
IIRC你声称的作品。我认为cppreference需要关于这方面的更新。 –
文档:查看最新的C++标准草案之一。它记录了库函数(但可能通过引用C标准)。请注意,有一条通用规则“除非明确声明可以将库传递给库函数,否则不能传递NULL”。 –
@πάνταῥεῖ:问题在于,既不在C也不在C++标准中(至少在我可以在互联网上找到的版本中),我可以找到对此的任何参考。在我测试过的linux系统上的相关手册页中也没有。 – MikeMB