Wireshark-dev: Re: [Wireshark-dev] Use of variadic macros

From: Guy Harris <guy@xxxxxxxxxxxx>
Date: Sun, 23 Sep 2012 15:10:02 -0700
On Sep 23, 2012, at 1:59 PM, Evan Huus <eapache@xxxxxxxxx> wrote:

> Variadic macros are forbidden in doc/README.developer since apparently
> not all compilers support them.
> 
> However, I just stumbled across a variadic macro that has apparently
> been part of the regular build since around 2009
> (packet-dcerpc-netlogon.c:65).
> 
> Since nobody (to my knowledge) has complained about a failing build in
> that time period, I have to assume that whatever ancient compiler
> didn't support them is no longer being used.

They're supported with Microsoft's compilers at least as far back as Visual Studio 2005:

	http://msdn.microsoft.com/en-us/library/ms177415(v=vs.80).aspx

There's no earlier version of the documentation offered by the "Other Versions" dropdown, but I don't know whether that means "earlier compilers, such as MSVC 6, didn't support them" or "we don't have the MSVC 6 documentation online".  This page:

	http://bytes.com/topic/c/answers/220087-macros-variable-parameter-list-ms-vc-compiler-6-0-a

has a claim that MSVC 6 didn't support variadic macros.  If that's the case, I don't personally have a problem with kicking MSVC 6 to the curb; we may already have done so in the documentation, as

	http://www.wireshark.org/docs/wsdg_html_chunked/ChToolsMSChain.html

only mentions it when it says "The official Wireshark 1.8.x releases are compiled using Microsoft Visual C++ 2010 SP1. The official 1.2, 1.4, and 1.6 releases are and were compiled using Microsoft Visual C++ 2008 SP1. Other past releases, including the 1.0 branch, were compiled using Microsoft Visual C++ 6.0.", and doesn't at all discuss using MSVC++ 6.

I don't know what other compilers, such as Sun C^WOracle Solaris Studio, HP's ANSI C compiler, or IBM's XL C support.  My *guess* is that older versions of those compilers may not have supported them but that they've all up-to-date with C99 features.

Sun C fully supported C99 as of Sun Studio 12 (not to be confused with Sun Studio, Memphis :-)):

	http://docs.oracle.com/cd/E19205-01/820-4155/c.html#about

*if* you specify -xc99; I don't know whether it or later versions support variadic macros without -xc99 or whether earlier versions supported them.

IBM C for AIX fully supported C99 as of V6.0 in 2002:

	http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&supplier=897&appname=IBMLinkRedirect&letternum=ENUS202-161

and XL C for AIX

	http://www-01.ibm.com/software/awdtools/xlcpp/aix/features/

supports C99 now (with no indication in the document of when it started, but the Wikipedia page for C99, whence I got these references, says it started with V11.1).  I don't know whether either of them have separate C89 and C99 modes (which they might, for the benefit of those developing code that needs to build on C89 compilers) or whether, in C89 mode, they support extensions such as variadic macros.  Given that one of IBM's compilers is the reason why we ban // comments - it disallows them by default - I suspect that, when not running in C99 (or C11?) mode, they do not support them.

The HP ANSI C compiler supports C99 at least as of A.06.25

	http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/Online_Help/getstarted.htm

I don't know whether it has separate C89 and C99 modes (which they might, for the benefit of those developing code that needs to build on C89 compilers) or whether, in C89 mode, it supports extensions such as variadic macros.

> P.S. Are there any other C99 features that we forbid that are actually
> supported by supposedly C89-only compilers like MSVC?

// comments are, I think, supported by MSVC; I don't know whether any UN*X C compilers support them without being told to run in C99 or C11 (or "GCC compatible"?) mode.

Turning on "full C99" mode for compilers does run the risk of people using C99 features *not* supported by MSVC++ and not having them discovered until the build breaks.