Annotation of embedaddon/libiconv/build-aux/snippet/c++defs.h, revision 1.1
1.1 ! misho 1: /* C++ compatible function declaration macros.
! 2: Copyright (C) 2010-2011 Free Software Foundation, Inc.
! 3:
! 4: This program is free software: you can redistribute it and/or modify it
! 5: under the terms of the GNU General Public License as published
! 6: by the Free Software Foundation; either version 3 of the License, or
! 7: (at your option) any later version.
! 8:
! 9: This program is distributed in the hope that it will be useful,
! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 12: General Public License for more details.
! 13:
! 14: You should have received a copy of the GNU General Public License
! 15: along with this program. If not, see <http://www.gnu.org/licenses/>. */
! 16:
! 17: #ifndef _GL_CXXDEFS_H
! 18: #define _GL_CXXDEFS_H
! 19:
! 20: /* The three most frequent use cases of these macros are:
! 21:
! 22: * For providing a substitute for a function that is missing on some
! 23: platforms, but is declared and works fine on the platforms on which
! 24: it exists:
! 25:
! 26: #if @GNULIB_FOO@
! 27: # if !@HAVE_FOO@
! 28: _GL_FUNCDECL_SYS (foo, ...);
! 29: # endif
! 30: _GL_CXXALIAS_SYS (foo, ...);
! 31: _GL_CXXALIASWARN (foo);
! 32: #elif defined GNULIB_POSIXCHECK
! 33: ...
! 34: #endif
! 35:
! 36: * For providing a replacement for a function that exists on all platforms,
! 37: but is broken/insufficient and needs to be replaced on some platforms:
! 38:
! 39: #if @GNULIB_FOO@
! 40: # if @REPLACE_FOO@
! 41: # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
! 42: # undef foo
! 43: # define foo rpl_foo
! 44: # endif
! 45: _GL_FUNCDECL_RPL (foo, ...);
! 46: _GL_CXXALIAS_RPL (foo, ...);
! 47: # else
! 48: _GL_CXXALIAS_SYS (foo, ...);
! 49: # endif
! 50: _GL_CXXALIASWARN (foo);
! 51: #elif defined GNULIB_POSIXCHECK
! 52: ...
! 53: #endif
! 54:
! 55: * For providing a replacement for a function that exists on some platforms
! 56: but is broken/insufficient and needs to be replaced on some of them and
! 57: is additionally either missing or undeclared on some other platforms:
! 58:
! 59: #if @GNULIB_FOO@
! 60: # if @REPLACE_FOO@
! 61: # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
! 62: # undef foo
! 63: # define foo rpl_foo
! 64: # endif
! 65: _GL_FUNCDECL_RPL (foo, ...);
! 66: _GL_CXXALIAS_RPL (foo, ...);
! 67: # else
! 68: # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
! 69: _GL_FUNCDECL_SYS (foo, ...);
! 70: # endif
! 71: _GL_CXXALIAS_SYS (foo, ...);
! 72: # endif
! 73: _GL_CXXALIASWARN (foo);
! 74: #elif defined GNULIB_POSIXCHECK
! 75: ...
! 76: #endif
! 77: */
! 78:
! 79: /* _GL_EXTERN_C declaration;
! 80: performs the declaration with C linkage. */
! 81: #if defined __cplusplus
! 82: # define _GL_EXTERN_C extern "C"
! 83: #else
! 84: # define _GL_EXTERN_C extern
! 85: #endif
! 86:
! 87: /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
! 88: declares a replacement function, named rpl_func, with the given prototype,
! 89: consisting of return type, parameters, and attributes.
! 90: Example:
! 91: _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
! 92: _GL_ARG_NONNULL ((1)));
! 93: */
! 94: #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
! 95: _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
! 96: #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
! 97: _GL_EXTERN_C rettype rpl_func parameters_and_attributes
! 98:
! 99: /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
! 100: declares the system function, named func, with the given prototype,
! 101: consisting of return type, parameters, and attributes.
! 102: Example:
! 103: _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
! 104: _GL_ARG_NONNULL ((1)));
! 105: */
! 106: #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
! 107: _GL_EXTERN_C rettype func parameters_and_attributes
! 108:
! 109: /* _GL_CXXALIAS_RPL (func, rettype, parameters);
! 110: declares a C++ alias called GNULIB_NAMESPACE::func
! 111: that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
! 112: Example:
! 113: _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
! 114: */
! 115: #define _GL_CXXALIAS_RPL(func,rettype,parameters) \
! 116: _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
! 117: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 118: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
! 119: namespace GNULIB_NAMESPACE \
! 120: { \
! 121: rettype (*const func) parameters = ::rpl_func; \
! 122: } \
! 123: _GL_EXTERN_C int _gl_cxxalias_dummy
! 124: #else
! 125: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
! 126: _GL_EXTERN_C int _gl_cxxalias_dummy
! 127: #endif
! 128:
! 129: /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
! 130: is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
! 131: except that the C function rpl_func may have a slightly different
! 132: declaration. A cast is used to silence the "invalid conversion" error
! 133: that would otherwise occur. */
! 134: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 135: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
! 136: namespace GNULIB_NAMESPACE \
! 137: { \
! 138: rettype (*const func) parameters = \
! 139: reinterpret_cast<rettype(*)parameters>(::rpl_func); \
! 140: } \
! 141: _GL_EXTERN_C int _gl_cxxalias_dummy
! 142: #else
! 143: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
! 144: _GL_EXTERN_C int _gl_cxxalias_dummy
! 145: #endif
! 146:
! 147: /* _GL_CXXALIAS_SYS (func, rettype, parameters);
! 148: declares a C++ alias called GNULIB_NAMESPACE::func
! 149: that redirects to the system provided function func, if GNULIB_NAMESPACE
! 150: is defined.
! 151: Example:
! 152: _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
! 153: */
! 154: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 155: /* If we were to write
! 156: rettype (*const func) parameters = ::func;
! 157: like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
! 158: better (remove an indirection through a 'static' pointer variable),
! 159: but then the _GL_CXXALIASWARN macro below would cause a warning not only
! 160: for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */
! 161: # define _GL_CXXALIAS_SYS(func,rettype,parameters) \
! 162: namespace GNULIB_NAMESPACE \
! 163: { \
! 164: static rettype (*func) parameters = ::func; \
! 165: } \
! 166: _GL_EXTERN_C int _gl_cxxalias_dummy
! 167: #else
! 168: # define _GL_CXXALIAS_SYS(func,rettype,parameters) \
! 169: _GL_EXTERN_C int _gl_cxxalias_dummy
! 170: #endif
! 171:
! 172: /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
! 173: is like _GL_CXXALIAS_SYS (func, rettype, parameters);
! 174: except that the C function func may have a slightly different declaration.
! 175: A cast is used to silence the "invalid conversion" error that would
! 176: otherwise occur. */
! 177: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 178: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
! 179: namespace GNULIB_NAMESPACE \
! 180: { \
! 181: static rettype (*func) parameters = \
! 182: reinterpret_cast<rettype(*)parameters>(::func); \
! 183: } \
! 184: _GL_EXTERN_C int _gl_cxxalias_dummy
! 185: #else
! 186: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
! 187: _GL_EXTERN_C int _gl_cxxalias_dummy
! 188: #endif
! 189:
! 190: /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
! 191: is like _GL_CXXALIAS_SYS (func, rettype, parameters);
! 192: except that the C function is picked among a set of overloaded functions,
! 193: namely the one with rettype2 and parameters2. Two consecutive casts
! 194: are used to silence the "cannot find a match" and "invalid conversion"
! 195: errors that would otherwise occur. */
! 196: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 197: /* The outer cast must be a reinterpret_cast.
! 198: The inner cast: When the function is defined as a set of overloaded
! 199: functions, it works as a static_cast<>, choosing the designated variant.
! 200: When the function is defined as a single variant, it works as a
! 201: reinterpret_cast<>. The parenthesized cast syntax works both ways. */
! 202: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
! 203: namespace GNULIB_NAMESPACE \
! 204: { \
! 205: static rettype (*func) parameters = \
! 206: reinterpret_cast<rettype(*)parameters>( \
! 207: (rettype2(*)parameters2)(::func)); \
! 208: } \
! 209: _GL_EXTERN_C int _gl_cxxalias_dummy
! 210: #else
! 211: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
! 212: _GL_EXTERN_C int _gl_cxxalias_dummy
! 213: #endif
! 214:
! 215: /* _GL_CXXALIASWARN (func);
! 216: causes a warning to be emitted when ::func is used but not when
! 217: GNULIB_NAMESPACE::func is used. func must be defined without overloaded
! 218: variants. */
! 219: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 220: # define _GL_CXXALIASWARN(func) \
! 221: _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
! 222: # define _GL_CXXALIASWARN_1(func,namespace) \
! 223: _GL_CXXALIASWARN_2 (func, namespace)
! 224: /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
! 225: we enable the warning only when not optimizing. */
! 226: # if !__OPTIMIZE__
! 227: # define _GL_CXXALIASWARN_2(func,namespace) \
! 228: _GL_WARN_ON_USE (func, \
! 229: "The symbol ::" #func " refers to the system function. " \
! 230: "Use " #namespace "::" #func " instead.")
! 231: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
! 232: # define _GL_CXXALIASWARN_2(func,namespace) \
! 233: extern __typeof__ (func) func
! 234: # else
! 235: # define _GL_CXXALIASWARN_2(func,namespace) \
! 236: _GL_EXTERN_C int _gl_cxxalias_dummy
! 237: # endif
! 238: #else
! 239: # define _GL_CXXALIASWARN(func) \
! 240: _GL_EXTERN_C int _gl_cxxalias_dummy
! 241: #endif
! 242:
! 243: /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
! 244: causes a warning to be emitted when the given overloaded variant of ::func
! 245: is used but not when GNULIB_NAMESPACE::func is used. */
! 246: #if defined __cplusplus && defined GNULIB_NAMESPACE
! 247: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
! 248: _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
! 249: GNULIB_NAMESPACE)
! 250: # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
! 251: _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
! 252: /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
! 253: we enable the warning only when not optimizing. */
! 254: # if !__OPTIMIZE__
! 255: # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
! 256: _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
! 257: "The symbol ::" #func " refers to the system function. " \
! 258: "Use " #namespace "::" #func " instead.")
! 259: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
! 260: # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
! 261: extern __typeof__ (func) func
! 262: # else
! 263: # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
! 264: _GL_EXTERN_C int _gl_cxxalias_dummy
! 265: # endif
! 266: #else
! 267: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
! 268: _GL_EXTERN_C int _gl_cxxalias_dummy
! 269: #endif
! 270:
! 271: #endif /* _GL_CXXDEFS_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>