Wrapping C that uses compiler extensions

simendsjo simen.endsjo at pandavre.com
Fri Mar 4 11:28:41 PST 2011


This code confuses me... It's from the c mysql windows dll, libmysql.dll.

   size_t (*snprintf)(struct charset_info_st *, char *to, size_t n,
                      const char *fmt,
                      ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5);

#ifndef _my_attribute_h
#define _my_attribute_h

/*
   Disable __attribute__() on gcc < 2.7, g++ < 3.4, and non-gcc compilers.
   Some forms of __attribute__ are actually supported in earlier versions of
   g++, but we just disable them all because we only use them to generate
   compilation warnings.
*/
#ifndef __attribute__
# if !defined(__GNUC__)
#  define __attribute__(A)
# elif GCC_VERSION < 2008
#  define __attribute__(A)
# elif defined(__cplusplus) && GCC_VERSION < 3004
#  define __attribute__(A)
# endif
#endif

/*
   __attribute__((format(...))) is only supported in gcc >= 2.8 and g++ 
 >= 3.4
   But that's already covered by the __attribute__ tests above, so this is
   just a convenience macro.
*/
#ifndef ATTRIBUTE_FORMAT
# define ATTRIBUTE_FORMAT(style, m, n) __attribute__((format(style, m, n)))
#endif

/*

    __attribute__((format(...))) on a function pointer is not supported
    until  gcc 3.1
*/
#ifndef ATTRIBUTE_FORMAT_FPTR
# if (GCC_VERSION >= 3001)
#  define ATTRIBUTE_FORMAT_FPTR(style, m, n) ATTRIBUTE_FORMAT(style, m, n)
# else
#  define ATTRIBUTE_FORMAT_FPTR(style, m, n)
# endif /* GNUC >= 3.1 */
#endif


#endif


More information about the Digitalmars-d-learn mailing list