2016-08-24 151 views
5

我想我读的地方,如果我通过一个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

+0

IIRC你声称的作品。我认为cppreference需要关于这方面的更新。 –

+0

文档:查看最新的C++标准草案之一。它记录了库函数(但可能通过引用C标准)。请注意,有一条通用规则“除非明确声明可以将库传递给库函数,否则不能传递NULL”。 –

+0

@πάνταῥεῖ:问题在于,既不在C也不在C++标准中(至少在我可以在互联网上找到的版本中),我可以找到对此的任何参考。在我测试过的linux系统上的相关手册页中也没有。 – MikeMB

回答

4

据我所知和其他人在评论中写道,根据ISO C或C++标准,上面的代码很可能是未定义的行为,并且就我自己的实验而言,在使用VS2015编译时会崩溃。

然而,就glibc的来讲,@rici是在现货:

The GNU C Library文档:

如果s是一个空指针,strftime的实际上并没有写任何东西,但而是返回它将写入的字符数。

+0

如果您提到此行为未由C或C++标准或POSIX指定,此答案将得到改进。对于非glibc的实现,将空指针作为第一个参数传递给'strftime'具有未定义的行为。 (当然,返回有用的信息与未定义的行为完全一致。) –

+0

@KeithThompson:添加了一条评论来明确指出这一点 – MikeMB

+0

一个诡辩:这是一个glibc问题;它与gcc或g ++没有直接关系。例如,你可以在glibc中使用clang或clang ++,并且可以在其他库实现中使用gcc或g ++。 –