[openal] The future of MSVC support with OpenAL Soft
Chris Robinson
chris.kcat at gmail.com
Wed May 21 13:57:49 EDT 2014
Before I go further, I'd like to clarify that what I'm discussing here
is /building/ OpenAL Soft. Compiling apps against pre-made binaries and
using it with your apps will not be affected in any way.
It's no secret MSVC has poor support for C since C90. It's also no
secret that they don't plan on fully supporting C99, C11, etc.
http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
However, from what I can tell, the thing that's really problematic is
that even the features they will be including in the future must work in
the context of C++. This is because to get those features, you actually
have to compile as C++. At that point, you're really just writing C++
code that masquerades as C, and as a result you won't have full C99/C11
or C++ to work with. It's kind of telling that the lead architect of
MSVC recommends GCC and Intel for proper C support.
As it is now, as of MSVC 2009 (the oldest MSVC version I currently care
about), it didn't even support the inline and restrict keywords in C,
things that were added to the language 10 years prior, despite the fact
that is does support the (similar) __inline and __restrict keywords.
Thankfully I can just define inline to __inline, and the compiler seems
to be okay with using it like C99 (in regards to inline/extern inline
definitions and declarations). The restrict keyword, however, doesn't
fair so well. Although MSVC has __restrict, I can't define restrict to
it because that breaks the __declspec(restrict) that Microsoft's headers
use. So I have to disable restrict on MSVC by defining it away to
nothing, which is pretty unfortunate since it can really help with
compiler optimizations.
In addition, MSVC 2009 doesn't allow variable declarations in for()
statements in C, as C99 allows. This would be something that could help
with code cleanliness in places since pre-C99 also requires local
variable declarations to be placed at the start of a code block. It can
also be used to create some crafty macros to help ensure proper cleanup
when a block of code ends (freeing a temporary memory pointer, releasing
an object reference, unlocking a lock, etc) without nasty gotos,
improving code readability and safety.
Going forward, I'd also really like to start using C11's atomic methods
to decrease the amount of mutex locking needed in the mixer. This is
something MSVC will/does support, but again, only when compiling as C++.
Another thing I'd really like is C99's compound literals... and this is
something MSVC will never support since IIRC the syntax is already used
in C++ mode to mean something different. I'd also like C99's designated
initializers -- that is, things like this:
struct timespec ts = { .tv_sec = sec, .tv_nsec = nsec };
int array[16] = { [0] = 1, [4] = 20, [10] = 52 };
... particularly when combined with compound literals.
Now, I'm not quite ready to drop MSVC support just yet. But it's clear
that as C improves and diverges from C++, and as other C compilers
continually gain new features, MSVC is always going to be the lowest
common denominator, and it's not going to be improving at all without
switching to C++. At some point, I imagine the hassle is just going to
be too much to directly support it.
What are your thoughts? Am I correct in my understanding of how MSVC's
C99/C11 support will work (i.e. only available in C++ mode, never
complete), or have things changed? How necessary is MSVC build support
if pre-built binaries are provided that will still work for developers?
Are there alternative ways to indirectly support MSVC with newer C code?
I know ffmpeg actually uses a wrapper program to convert their C99 code
to something MSVC accepts, although it's incomplete.
More information about the openal
mailing list