C/C++ C4047 diffère dans les niveaux d'indirection de 'int'?
Je suis donc tenter de compiler SQLite (à l'aide d'un autre Périphérique Cible est alors généralement utilisé) et j'en suis bizarre d'avertissement et d'erreur et je ne suis pas sûr de ce que cela signifie pour comment résoudre le problème. Ici est le message que j'obtiens après je tente de compiler à partir de Visual Studio:
4>Compiler...
4>interop.c
4> sqlite3.c(11857) : erreur C2220: avertissement traitée comme une erreur - aucun "objet" fichier généré
4> sqlite3.c(11857) : warning C4013: 'localtime' undefined; en supposant extern retournant int
4> sqlite3.c(11857) : warning C4047: '=' : 'tm *' diffère dans les niveaux d'indirection de 'int'
4> sqlite3.c(28379) : erreur C2040: 'localtime' : 'tm *(const time_t *)' diffère dans les niveaux d'indirection de 'int ()'
Et voici le code de ces lignes:
#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
Et la définition de la méthode pour localtime (), où il se plaint à propos de la ligne 28379 et l'indirection:
/*************************************************************************
** 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;
}
MODIFIER
Voici la structure d'une définition trop:
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 */
};
Je n'ai pas été en mesure de comprendre ce que "'tm*' diffère dans les niveaux d'indirection de 'int'" moyens ou comment résoudre le problème, je ne suis même pas vraiment sûr de ce que la question est depuis cette compile pour Win32, mais pas pour WinCE.
Quelqu'un a une aperçu de l'avertissement\erreur ou comment résoudre le problème? Toute aide est grandement appréciée!
Merci!
OriginalL'auteur Ian Dallas | 2011-06-17
Vous devez vous connecter pour publier un commentaire.
De la déclaration de votre
localtime
fonction n'est pas disponible au point où il est utilisé. En vertu de C règles, le compilateur suppose donc que c'est une fonction inconnue de retourner un int. Il avertit ensuite sur la conversion qui inttm*
(c'est ce que les "niveaux d'indirection" chose est sur).La solution est de déclarer
localtime
quelque part pour que le compilateur puisse le voir lors de la compilation de sqlite3.c, comme dans un fichier d'en-tête inclus à partir de ce fichier.Le second "les niveaux d'indirection" message (le message d'erreur) semble être à cause de la définition de
localtime
après il a été utilisé, de sorte que le compilateur a déjà deviné la signature d'avoir un int type de retour, et votre signature réelle diffère de celle.Assurez-vous qu'une déclaration correcte de
localtime
est disponible avant le point où il est utilisé. Tout simplement, vous avez besoin de placer la lignequelque part avant la ligne 11857. Vous pouvez mettre de la définition (le corps de la fonction) où vous voulez, assurez-vous que la déclaration de la signature de la fonction) est connu avant que la fonction est utilisée n'importe où.
Génial!! Merci!
OriginalL'auteur Sven
Vous devez définir une
extern
localtime dans sqlite3.cLe compilateur par défaut il returing un
int
qui n'est PAS compatible avec unstruct tm
.OriginalL'auteur Richard Schneider