C/C++ C4047的间接级别与'int'不同?

Ian*_*las 3 c c++ windows-ce visual-studio

所以我试图编译SQLite(使用不同的目标设备,然后通常使用),我得到一个奇怪的警告和错误,我不知道如何解决它的意义.这是我尝试从Visual Studio中编译后得到的消息:

4>编译...
4> interop.c
4> sqlite3.c(11857):错误C2220:警告视为错误 - 未生成"对象"文件
4> sqlite3.c(11857):警告C4013:'localtime'undefined ; 假设extern返回int
4> sqlite3.c(11857):警告C4047:'=':'tm*'的间接级别与'
int'4> sqlite3.c(28379)不同:错误C2040:'localtime':' 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
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

编辑 这里也是结构定义:

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 */
};
Run Code Online (Sandbox Code Playgroud)

我真的无法弄清楚''tm*'与'int'的间接级别有什么不同意味着或者如何解决它,我甚至不确定问题是什么,因为这为Win32编译但是不适合WinCE.

有没有人对警告\错误或如何解决它有任何见解?任何帮助是极大的赞赏!

谢谢!

Sve*_*ven 9

您的localtime功能声明在使用时无法使用.因此,在C规则下,编译器假定它是一个返回int的未知函数.然后它会警告将int转换为a tm*(这就是"间接级别"的内容).

解决方案是在localtime某处声明,以便编译器在编译sqlite3.c时可以看到它,就像在该文件中包含的头文件中一样.

第二个"间接级别"消息(错误)似乎是因为您localtime在使用它之后进行了定义,因此编译器已经猜到签名具有int返回类型,并且您的实际签名与此不同.

确保在使用它之前localtime提供正确的声明.简单地说,你需要放置线

struct tm *__cdecl localtime(const time_t *t);
Run Code Online (Sandbox Code Playgroud)

在11857行之前的某个地方.您可以将定义(函数体)放在任何地方,只需确保在函数被使用之前声明(函数签名).