2016-08-24 3 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; 
} 

Однако я не смог найти свой оригинал или любую другую документацию, будет определять это поведение. Поэтому мой вопрос:

  • В каких системах/компиляторах/реализациях стандартной библиотеки (если есть) это гарантированное поведение?
  • Где я могу найти соответствующую документацию?

Edit: Я добавил метку C, как я видел один и тот же результат с эквивалентным кодом C и, по крайней мере с GCC/г ++ (или, скорее, Glibc/libstdC++) std::strftime, вероятно, просто псевдоним для c- функция strftime в любом случае.

+0

IIRC, что вы утверждаете, работает. Я думаю, что cppreference нуждается в обновлении об этом. –

+0

Документация: посмотрите один из черновиков для последнего стандарта C++. Он документирует функции библиотеки (но, возможно, ссылаясь на стандарт C). Обратите внимание, что существует общее правило: «вы не можете передавать NULL в библиотечную функцию, если только это явно не говорит». –

+0

@ πάνταῥεῖ: Дело в том, что ни в стандарте C, ни в C++ (по крайней мере, в версиях, которые я могу найти в Интернете) я могу найти любую ссылку на это. И в соответствующих man-страницах на 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 ++. Например, вы можете использовать clang или clang ++ с glibc, и вы можете использовать gcc или g ++ с другими реализациями библиотек. –

Смежные вопросы