2016-08-24 122 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 ++。 –