Workaround VS bug w.r.t empty arguments to macros

Empty arguments can be passed to macros per C99 and C++11 specs, which
can then be forwarded to other macros.

Visual Studio's compiler has a bug in the following situation:

    #define A(x) #x
    #define B(x, y) A(x)
    B(, b)

In the above case, Visual Studio first expands x to nothing, then
complains that A is not invoked with the right amount of arguments.
However, x in A(x) is still one argument, even if it expands to no
preprocessing tokens.  See also https://stackoverflow.com/a/7674214.
This commit is contained in:
Shahbaz Youssefi 2019-12-16 11:23:21 -05:00
parent 5b162a79d4
commit d201646906

View File

@ -79,7 +79,16 @@
#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
// Stringifies its argument.
#define GTEST_STRINGIFY_(name) #name
// Work around a bug in visual studio which doesn't accept code like this:
//
// #define GTEST_STRINGIFY_(name) #name
// #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ...
// MACRO(, x, y)
//
// Complaining about the argument to GTEST_STRINGIFY_ being empty.
// This is allowed by the spec.
#define GTEST_STRINGIFY_HELPER_(name, ...) #name
#define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__,)
namespace proto2 { class Message; }