Почему компиляция этого кода вызывает ошибку? - PullRequest
4 голосов
/ 22 ноября 2011

Я считаю, что это правильный заголовок:

  #include <cstdio>

Обратите внимание, что между приведенной выше декларацией и этой есть разница:

  #include <stdio.h>

Первый помещает все в пространство имен "std", второй - нет. Поэтому я использую первый.

Ниже приведен код, который я компилирую с помощью g ++ 4.4.6 на aix6.1: -

#include <cstdarg> //< va_list
#include <cstdio>  //< vsnprintf()
#include "virtual_utils.h"

namespace VS
{


const char* format_str( const char* str, ... ) throw()
{
  static char buf[10][1024];
  static unsigned long buf_no = 0;

  char* cur_buf = buf[ ++buf_no % 10 ];
  buf_no %= 10;

  va_list vl;
  va_start( vl, str );
#ifdef _MSC_VER
  std::_vsnprintf( cur_buf, sizeof(buf), str, vl );
#else
  std::vsnprintf( cur_buf, sizeof(buf), str, vl );
#endif

  return cur_buf;
}


} //< namespace VS

Это следующие ошибки, которые я получаю: -

virtual_utils.C: In function 'const char* VS::format_str(const char*, ...)':
virtual_utils.C:28: error: 'vsnprintf' is not a member of 'std'

Edit: Модифицируя приведенный выше код для удаления #include "virtual_utils.h" и добавления main(), он компилируется с предупреждением в gcc4.3.4 для Ideone и чисто в gcc4.5.1 .

1 Ответ

1 голос
/ 22 ноября 2011

Скомпилируйте с --save-temps и проверьте созданный файл .ii.Это должно прояснить, что определено в каком пространстве имен, а что нет.

...