Messages in this thread | | | Date | Mon, 3 Mar 2008 13:40:50 +0100 | From | Sam Ravnborg <> | Subject | Re: [PATCH 1/2] Add C99-style constructor macros for specific-sized integers |
| |
On Mon, Mar 03, 2008 at 11:43:10AM +0000, Russell King wrote: > On Mon, Mar 03, 2008 at 10:57:32AM +0000, David Howells wrote: > > H. Peter Anvin <hpa@zytor.com> wrote: > > > > > +#define S8_C(x) x > > > +#define U8_C(x) x ## U > > > +#define S16_C(x) x > > > +#define U16_C(x) x ## U > > > +#define S32_C(x) x > > > +#define U32_C(x) x ## U > > > +#define S64_C(x) x ## LL > > > +#define U64_C(x) x ## ULL > > > > And #if defined(__ASSEMBLY__), just splat x through as is. > > We already have something like this on ARM - include/asm-arm/memory.h > > /* > * Allow for constants defined here to be used from assembly code > * by prepending the UL suffix only with actual C code compilation. > */ > #ifndef __ASSEMBLY__ > #define UL(x) (x##UL) > #else > #define UL(x) (x) > #endif
And in linux/const.h we have yet another variant: /* Some constant macros are used in both assembler and * C code. Therefore we cannot annotate them always with * 'UL' and other type specifiers unilaterally. We * use the following macros to deal with this. * * Similarly, _AT() will cast an expression with a type in C, but * leave it unchanged in asm. */
#ifdef __ASSEMBLY__ #define _AC(X,Y) X #define _AT(T,X) X #else #define __AC(X,Y) (X##Y) #define _AC(X,Y) __AC(X,Y) #define _AT(T,X) ((T)(X)) #endif
Not as typestrict as hpa's and arm's version but used in a few placed already.
Sam
| |