C / C ++ C4047 отличается по уровням косвенности от 'int'? - PullRequest
3 голосов
/ 17 июня 2011

Поэтому я пытаюсь скомпилировать SQLite (с использованием другого целевого устройства, которое обычно используется), и я получаю странное предупреждение и ошибку, и я не уверен, что это значит для того, как это исправить. Вот сообщение, которое я получаю после попытки компиляции из Visual Studio:

4> Компиляция ...
4> interop.c
4> sqlite3.c (11857): ошибка C2220: предупреждение обрабатывается как ошибка - файл «объект» не создан
4> sqlite3.c (11857): предупреждение C4013: «местное время» не определено; предполагая, что extern возвращает int
4> sqlite3.c (11857): предупреждение C4047: '=': 'tm *' отличается по уровням косвенности от 'int'
4> sqlite3.c (28379): ошибка C2040: «локальное время»: «tm * (const time_t *)» отличается по уровням косвенности от «int ()»

А вот код в этих строках:

#else
{
    struct tm *pTm;
    sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER))
    pTm = localtime(&t);                                //Line 11857
    y.Y = pTm->tm_year + 1900;                          
    y.M = pTm->tm_mon + 1;                              
    y.D = pTm->tm_mday;                                 
    y.h = pTm->tm_hour;                                 
    y.m = pTm->tm_min;                                  
    y.s = pTm->tm_sec;                                  
    sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
}
#endif

И определение метода для localtime (), где он жалуется на строку 28379 и косвенное указание:

/*************************************************************************
** This section contains code for WinCE only.
*/
/*
** WindowsCE does not have a localtime() function.  So create a
** substitute.
*/
struct tm *__cdecl localtime(const time_t *t)                
{                                                               // Line 28379
  static struct tm y;
  FILETIME uTm, lTm;
  SYSTEMTIME pTm;
  sqlite3_int64 t64;
  t64 = *t;
  t64 = (t64 + 11644473600)*10000000;
  uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF);
  uTm.dwHighDateTime= (DWORD)(t64 >> 32);
  FileTimeToLocalFileTime(&uTm,&lTm);
  FileTimeToSystemTime(&lTm,&pTm);
  y.tm_year = pTm.wYear - 1900;
  y.tm_mon = pTm.wMonth - 1;
  y.tm_wday = pTm.wDayOfWeek;
  y.tm_mday = pTm.wDay;
  y.tm_hour = pTm.wHour;
  y.tm_min = pTm.wMinute;
  y.tm_sec = pTm.wSecond;
  return &y;
}

EDIT Вот определение структуры тоже:

struct tm {
    int tm_sec;     /* seconds after the minute - [0,59] */
    int tm_min;     /* minutes after the hour - [0,59] */
    int tm_hour;    /* hours since midnight - [0,23] */
    int tm_mday;    /* day of the month - [1,31] */
    int tm_mon;     /* months since January - [0,11] */
    int tm_year;    /* years since 1900 */
    int tm_wday;    /* days since Sunday - [0,6] */
    int tm_yday;    /* days since January 1 - [0,365] */
    int tm_isdst;   /* daylight savings time flag */
};

Я действительно не смог выяснить, что "tm *" отличается по уровням косвенности от значения "int" или как это исправить, я даже не совсем уверен, в чем проблема, так как это компилируется для Win32, но не для WinCE.

У кого-нибудь есть понимание предупреждения \ ошибки или как это исправить? Любая помощь с благодарностью!

Спасибо!

Ответы [ 2 ]

9 голосов
/ 17 июня 2011

Объявление вашей функции localtime недоступно в тот момент, когда она используется. В соответствии с правилами C компилятор предполагает, что это неизвестная функция, возвращающая int. Затем он предупреждает о преобразовании этого int в tm* (это то, что означает "уровни косвенности").

Решение состоит в том, чтобы объявить где-то localtime, чтобы компилятор мог видеть его при компиляции sqlite3.c, как в заголовочном файле, включенном в этот файл.

Второе сообщение «уровни косвенности» (ошибка), по-видимому, связано с тем, что вы определяете localtime после его использования, поэтому компилятор уже предположил, что подпись имеет тип возвращаемого значения int, и ваша действительная подпись отличается из этого.

Убедитесь, что правильное объявление localtime доступно до точки, в которой оно используется. Проще говоря, вам нужно разместить линию

struct tm *__cdecl localtime(const time_t *t);

где-то перед строкой 11857. Вы можете поместить определение (тело функции) куда угодно, просто убедитесь, что объявление (сигнатура функции) известно, прежде чем функция будет использоваться где-либо.

1 голос
/ 17 июня 2011

Вам необходимо определить extern местное время в sqlite3.c

Компилятор по умолчанию возвращается к int, который НЕ совместим с struct tm.

...