[FFmpeg-devel] [PATCH 2/2] Require compilers to support C17.

James Almer jamrial at gmail.com
Mon Feb 5 22:12:00 EET 2024


On 2/5/2024 4:54 PM, Anton Khirnov wrote:
> It should be available in all relevant modern compilers and will allow
> us to use features like anonymous unions.
> 
> Note that stdatomic.h is still emulated on MSVC, as current versions
> require the /experimental:c11atomics, and do not support
> ATOMIC_VAR_INIT() anyway.
> ---
> Now moving to C17 rather than C11, as the former contains important
> fixes and its support across the compilers we care about should be
> similar.
> 
> Now also tested with MSVC in wine, thanks to Martin for pointing me at
> https://github.com/mstorsjo/msvc-wine
> ---
>   configure          | 23 +++++++++++------------
>   doc/developer.texi | 10 ++--------
>   2 files changed, 13 insertions(+), 20 deletions(-)
> 
> diff --git a/configure b/configure
> index f72533b7d2..1bb9e23f19 100755
> --- a/configure
> +++ b/configure
> @@ -4705,7 +4705,7 @@ msvc_common_flags(){
>               # generic catch all at the bottom will print the original flag.
>               -Wall)                ;;
>               -Wextra)              ;;
> -            -std=c*)              ;;
> +            -std=c*)              echo /std:${flag#-std=};;
>               # Common flags
>               -fomit-frame-pointer) ;;
>               -g)                   echo -Z7 ;;
> @@ -4750,7 +4750,7 @@ icl_flags(){
>               # Despite what Intel's documentation says -Wall, which is supported
>               # on Windows, does enable remarks so disable them here.
>               -Wall)                echo $flag -Qdiag-disable:remark ;;
> -            -std=c99)             echo -Qstd=c99 ;;
> +            -std=c17)             echo -Qstd=c17 ;;
>               -flto*)               echo -ipo ;;
>           esac
>       done
> @@ -4798,7 +4798,7 @@ suncc_flags(){
>                       athlon*)                   echo -xarch=pentium_proa  ;;
>                   esac
>                   ;;
> -            -std=c99)             echo -xc99              ;;
> +            -std=c17)             echo -xc17              ;;

Does SunCC support this? Does anyone use SunCC at all?

>               -fomit-frame-pointer) echo -xregs=frameptr    ;;
>               -fPIC)                echo -KPIC -xcode=pic32 ;;
>               -W*,*)                echo $flag              ;;
> @@ -4887,8 +4887,8 @@ probe_cc(){
>           _type=suncc
>           _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
>           _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
> -        _DEPFLAGS='-xM1 -xc99'
> -        _ldflags='-std=c99'
> +        _DEPFLAGS='-xM1 -xc17'
> +        _ldflags='-std=c17'
>           _cflags_speed='-O5'
>           _cflags_size='-O5 -xspace'
>           _flags_filter=suncc_flags
> @@ -5517,21 +5517,20 @@ if test "$?" != 0; then
>       die "C compiler test failed."
>   fi
>   
> -add_cppflags -D_ISOC99_SOURCE
> +add_cppflags -D_ISOC11_SOURCE
>   add_cxxflags -D__STDC_CONSTANT_MACROS
>   check_cxxflags -std=c++11 || check_cxxflags -std=c++0x
>   
> -# some compilers silently accept -std=c11, so we also need to check that the
> +# some compilers silently accept -std=c17, so we also need to check that the
>   # version macro is defined properly
> -test_cflags_cc -std=c11 ctype.h "__STDC_VERSION__ >= 201112L" &&
> -    add_cflags -std=c11 ||
> -    check_cflags -std=c99
> +test_cflags_cc -std=c17 ctype.h "__STDC_VERSION__ >= 201710L" &&
> +    add_cflags -std=c17 || die "Compiler lacks C17 support"
>   
>   check_cppflags -D_FILE_OFFSET_BITS=64
>   check_cppflags -D_LARGEFILE_SOURCE
>   
> -add_host_cppflags -D_ISOC99_SOURCE
> -check_host_cflags -std=c99
> +add_host_cppflags -D_ISOC11_SOURCE
> +check_host_cflags -std=c17
>   check_host_cflags -Wall
>   check_host_cflags $host_cflags_speed
>   
> diff --git a/doc/developer.texi b/doc/developer.texi
> index eed0ee4915..6e9807aa06 100644
> --- a/doc/developer.texi
> +++ b/doc/developer.texi
> @@ -56,14 +56,8 @@ and should try to fix issues their commit causes.
>   
>   @section Language
>   
> -FFmpeg is mainly programmed in the ISO C99 language, extended with:
> - at itemize @bullet
> - at item
> -Atomic operations from C11 @file{stdatomic.h}. They are emulated on
> -architectures/compilers that do not support them, so all FFmpeg-internal code
> -may use atomics without any extra checks. However, @file{stdatomic.h} must not
> -be included in public headers, so they stay C99-compatible.
> - at end itemize
> +FFmpeg is mainly programmed in the ISO C17 language, except for the public
> +headers which must stay C99 compatible.
>   
>   Compiler-specific extensions may be used with good reason, but must not be
>   depended on, i.e. the code must still compile and work with compilers lacking


More information about the ffmpeg-devel mailing list