Files
fltk/FL/fl_attr.h
Albrecht Schlosser 27101536f6
Some checks are pending
Build and Test / build-linux (push) Waiting to run
Build and Test / build-wayland (push) Waiting to run
Build and Test / build-macos (push) Waiting to run
Build and Test / build-windows (push) Waiting to run
Define FL_OVERRIDE unconditionally as 'override'
FLTK 1.5 requires at least C++11, hence we can always use 'override'.

To do: the FL_OVERRIDE macro can be replaced by 'override' everywhere
in the FLTK code. There are more than 2400 occurrences and this
would be a large commit. Therefore it's not done right now...

Note: user code may continue to use FL_OVERRIDE.
2025-03-06 19:23:25 +01:00

214 lines
5.3 KiB
C++

/*
* Function attribute declarations for the Fast Light Tool Kit (FLTK).
*
* Copyright 1998-2025 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
* file is missing or damaged, see the license at:
*
* https://www.fltk.org/COPYING.php
*
* Please see the following page on how to report bugs and issues:
*
* https://www.fltk.org/bugs.php
*/
/**
\file fl_attr.h
This file defines compiler-specific macros
*/
#ifndef _FL_fl_attr_h_
#define _FL_fl_attr_h_
/**
This macro makes it safe to use the C++11 keyword \c override with
older compilers.
Since FLTK 1.5.0 a C++11 capable compiler is required, hence we can safely
define FL_OVERRIDE unconditionally as 'override'.
This macro is kept for backwards compatibility with old (1.4.x) user code
that uses the FL_OVERRIDE macro.
We recommend to use 'override' explicitly if C++11 or higher is available.
*/
#define FL_OVERRIDE override
/**
This section lists macros for Doxygen documentation only. The next section
will define the actual macros based on the compile used and based on the
capabilities of the version of that compiler.
*/
#ifdef FL_DOXYGEN
/** To be used in prototypes with a variable list of arguments.
This macro helps detection of mismatches between format string and
argument list at compilation time.
Usage example: FL/fl_ask.H
*/
#define __fl_attr(x)
/**
Enclosing a function or method in FL_DEPRECATED marks it as no longer
recommended. This macro syntax can not be used if the return type contains
a comma, which is not the case in FLTK.
\code
FL_DEPRECATED("Outdated, don't use", int position()) { return position_; }
\endcode
*/
#define FL_DEPRECATED(msg, func) \
/##*##* \deprecated msg *##/ \
func
#else /* FL_DOXYGEN */
// If FL_NO_DEPRECATED is defined FLTK 1.4 can compile 1.3.x code without
// issuing several "deprecated" warnings (1.3 "compatibility" mode).
// FL_DEPRECATED will be defined as a no-op.
// If FL_NO_DEPRECATED is not defined (default) FLTK 1.4 will issue several
// "deprecated" warnings depending on the compiler in use: FL_DEPRECATED
// will be defined according to the capabilities of the compiler (below).
// The definition below this comment must match the one at the end of this file.
#if defined(FL_NO_DEPRECATED)
#define FL_DEPRECATED(msg, func) func
#endif
#ifdef __cplusplus
/*
Declare macros specific to Visual Studio.
Visual Studio defines __cplusplus = '199711L' in all its versions which is
not helpful for us here. For VS version number encoding see:
https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros
This document specifies that the macro _MSVC_LANG is defined since
"Visual Studio 2015 Update 3" as 201402L (default) and undefined in
earlier versions. It can be used to determine the C++ standard as
specified by the /std:c++ compiler option:
- /std:c++14 201402L (also if /std:c++ is not used)
- /std:c++17 201703L
- /std:c++20 202002L
- /std:c++latest a "higher, unspecified value" (docs of VS 2022)
As of this writing (02/2023) _MSVC_LANG is not yet used in this file
but it is documented for future use.
*/
#if defined(_MSC_VER)
#if (_MSC_VER >= 1900) // Visual Studio 2015 (14.0)
#endif // Visual Studio 2015 (14.0)
#if (_MSC_VER >= 1400) // Visual Studio 2005 (8.0)
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) __declspec(deprecated(msg)) func
#endif
#endif // Visual Studio 2005 (8.0)
#if (_MSC_VER >= 1310) // Visual Studio .NET 2003 (7.1)
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) __declspec(deprecated) func
#endif
#endif // Visual Studio .NET 2003 (7.1)
#endif // Visual Studio
/*
Declare macros specific to the C++ standard used.
Macros may have been declared already in previous sections.
*/
#if (__cplusplus >= 202002L) // C++20
#endif // C++20
#if (__cplusplus >= 201703L) // C++17
#endif // C++17
#if (__cplusplus >= 201402L) // C++14
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) [[deprecated(msg)]] func
#endif
#endif // C++14
#if (__cplusplus >= 201103L) // C++11
#endif // C+11
#if (__cplusplus >= 199711L) // C++89
#endif // C++89
#endif // __cplusplus
/*
Declare macros specific to clang
Macros may have been declared already in previous sections.
*/
#if defined(__clang__)
#define FL_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
// -- nothing yet --
#endif /* __clang__ */
/*
Declare macros specific to gcc.
Macros may have been declared already in previous sections.
*/
#if defined(__GNUC__)
#define FL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#ifndef __fl_attr
#define __fl_attr(x) __attribute__ (x)
#endif
#if FL_GCC_VERSION > 40500 /* gcc 4.5.0 */
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) func __attribute__((deprecated(msg)))
#endif
#endif /* gcc 4.5.0 */
#if FL_GCC_VERSION >= 30400 /* gcc 3.4.0 */
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) func __attribute__((deprecated))
#endif
#endif /* gcc 3.4.0 */
#endif /* __GNUC__ */
/*
If a macro was not defined in any of the sections above, set it to no-op here.
*/
#ifndef __fl_attr
#define __fl_attr(x)
#endif
#ifndef FL_DEPRECATED
#define FL_DEPRECATED(msg, func) func
#endif
#endif /* FL_DOXYGEN */
#endif /* !_FL_fl_attr_h_ */