C/C++ C4047 的间接级别与"int"不同?
C/C++ C4047 differs in levels of indirection from 'int'?
因此,我正试图编译SQLite(使用通常使用的不同目标设备),但我收到了一个奇怪的警告和错误,我不确定它对如何修复它意味着什么
4> 正在编译
4> interop.c
4> sqlite3.c(11857):错误C2220:警告被视为错误-未生成"对象"文件
4> sqlite3.c(11857):警告C4013:未定义"localtime";假设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
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;
}
编辑这也是结构定义:
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 */
};
我真的不知道"‘m*’与‘int’在间接级别上的不同"是什么意思,也不知道如何解决它,我甚至不确定问题是什么,因为这是为Win32而不是WinCE编译的。
有人了解警告\错误或如何修复它吗?非常感谢您的帮助!
谢谢!
localtime
函数的声明在使用时不可用。因此,在C规则下,编译器假设它是一个返回int的未知函数。然后它警告将该int转换为tm*
(这就是"间接级别"的含义)。
解决方案是在某个地方声明localtime
,以便编译器在编译sqlite3.c时可以看到它,就像在该文件中包含的头文件中一样。
第二个"间接级别"消息(错误)似乎是因为您在使用localtime
之后定义了它,所以编译器已经猜测签名具有int返回类型,而实际签名与此不同。
确保localtime
的正确声明在使用点之前可用。简单地说,你需要放置线路
struct tm *__cdecl localtime(const time_t *t);
11857线之前的某个地方。您可以将定义(函数体)放在任何您想要的地方,只需确保在任何地方使用函数之前声明(函数签名)是已知的。
您需要在sqlite3.c 中定义extern
本地时间
编译器默认返回与struct tm
不兼容的int
。
- int x=1000和just x=1000产生不同的值
- int* 和 int** 是不同的类型吗?C++
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- 而数组中的每个值都与特定的 int 值不同
- 为什么在此代码中使用 auto 和 int 给出不同的答案?
- 为什么允许 int 和 const int 使用不同的转换函数?
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- 不同类型的"decltype((const int)a)"和"decltype((cons
- 为什么printf和cout为此无符号int提供了不同的输出
- 使用 atoi 将字符数组转换为 int 会给出不同的值
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- C++ 重载与有符号和无符号 int 不同
- 数组中使用 int 中的位的不同元素数
- 传递 const int* 和 int* 时调用重载函数的不同版本(const int* const&/&&)
- 为什么将浮点变量与另一个浮点变量的缩减为int给出了完全不同的答案
- 为什么没有"int"类型声明时输出不同?
- 为什么 GCC 认为模板参数是 int 而它是一个完全不同的类型?
- 这个语句到底是什么意思 stack<int, list<int> > 它与 stack 有何不同<int>?
- C/C++ C4047 的间接级别与"int"不同?