1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-06 15:49:35 +03:00

Attempt to provide a version of the SQLITE_INT_TO_PTR macro that works

on both llvm-gcc-4.2 and MSVC.  Ticket #3860. (CVS 6641)

FossilOrigin-Name: ddee7ff23e9a396cab89d20ff9fc4cf3dfd4561c
This commit is contained in:
drh
2009-05-16 17:38:21 +00:00
parent 74632880b7
commit 875e9e7d88
3 changed files with 34 additions and 24 deletions

View File

@@ -11,7 +11,7 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
** @(#) $Id: sqliteInt.h,v 1.871 2009/05/13 17:21:14 drh Exp $
** @(#) $Id: sqliteInt.h,v 1.872 2009/05/16 17:38:21 drh Exp $
*/
#ifndef _SQLITEINT_H_
#define _SQLITEINT_H_
@@ -51,21 +51,31 @@
#endif
/*
* This macro is used to "hide" some ugliness in casting an int
* value to a ptr value under the MSVC 64-bit compiler. Casting
* non 64-bit values to ptr types results in a "hard" error with
* the MSVC 64-bit compiler which this attempts to avoid.
*
* A simple compiler pragma or casting sequence could not be found
* to correct this in all situations, so this macro was introduced.
*
* It could be argued that the intptr_t type could be used in this
* case, but that type is not available on all compilers, or
* requires the #include of specific headers which differs between
* platforms.
*/
#define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X])
#define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0))
** This macro is used to "hide" some ugliness in casting an int
** value to a ptr value under the MSVC 64-bit compiler. Casting
** non 64-bit values to ptr types results in a "hard" error with
** the MSVC 64-bit compiler which this attempts to avoid.
**
** A simple compiler pragma or casting sequence could not be found
** to correct this in all situations, so this macro was introduced.
**
** It could be argued that the intptr_t type could be used in this
** case, but that type is not available on all compilers, or
** requires the #include of specific headers which differs between
** platforms.
**
** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on
** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)).
** We we have to define the macros in different ways depending on the
** compiler.
*/
#if defined(__GNUC__)
# define SQLITE_INT_TO_PTR(X) ((void*)(X))
# define SQLITE_PTR_TO_INT(X) ((int)(X))
#else
# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X])
# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0))
#endif
/*
** These #defines should enable >2GB file support on POSIX if the